您好,登錄后才能下訂單哦!
小編給大家分享一下XML命名空間節點如何讀取,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
XML 命名空間提供避免元素命名沖突的方法。
在 XML 中,元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。
這個 XML 文檔攜帶著某個表格中的信息:
<tr> <td>Apples</td> <td>Bananas</td> </tr>
這個 XML 文檔攜帶有關桌子的信息(一件家具):
<name>African Coffee Table</name> <width>80</width> <length>120</length>
假如這兩個 XML 文檔被一起使用,由于兩個文檔都包含帶有不同內容和定義的 <table> 元素,就會發生命名沖突。
XML 解析器無法確定如何處理這類沖突。
此文檔帶有某個表格中的信息:
<h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr>
此 XML 文檔攜帶著有關一件家具的信息:
<f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length>
現在,命名沖突不存在了,這是由于兩個文檔都使用了不同的名稱來命名它們的 <table> 元素 (<h:table> 和 <f:table>)。
通過使用前綴,我們創建了兩種不同類型的 <table> 元素。
這個 XML 文檔攜帶著某個表格中的信息:
<h:table > <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
此 XML 文檔攜帶著有關一件家具的信息:
<f:table > <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
與僅僅使用前綴不同,我們為 <table> 標簽添加了一個 xmlns 屬性,這樣就為前綴賦予了一個與某個命名空間相關聯的限定名稱。
XML 命名空間屬性被放置于元素的開始標簽之中,并使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
當命名空間被定義在元素的開始標簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關聯。
注釋:用于標示命名空間的地址不會被解析器用于查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向實際存在的網頁,這個網頁包含關于命名空間的信息。
統一資源標識符是一串可以標識因特網資源的字符。最常用的 URI 是用來標示因特網域名地址的統一資源定位器(URL)。另一個不那么常用的 URI 是統一資源命名(URN)。在我們的例子中,我們僅使用 URL。
為元素定義默認的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。
請使用下面的語法:
xmlns="namespaceURI"
這個 XML 文檔攜帶著某個表格中的信息:
<table > <tr> <td>Apples</td> <td>Bananas</td> </tr> </table>
此 XML 文檔攜帶著有關一件家具的信息:
<table > <name>African Coffee Table</name> <width>80</width> <length>120</length> </table> (轉原文http://www.cnblogs.com/mgen/archive/2011/05/24/2056025.html)
眾所周知,XmlDocument可以進行XPath查詢,但實際上這里所說的XPath查詢僅限于沒有命名空間(沒有xmlns屬性)的XML,一旦遇到有命名空間的XML,對應XPath查詢都會無結果。
比如下面這個XML
<a xmlns="mgen.cnblogs.com"> <b>ccc</b> </a>
XPath查詢/a/b會返回null,而如果沒有xmlns的話,會返回節點b。
If the XPath expression does not include a prefix, it is assumed that the namespace URI is the empty namespace. If your XML includes a default namespace, you must still add a prefix and namespace URI to the XmlNamespaceManager; otherwise, you will not get any nodes selected
意思就是如果XPath表達式沒有加前綴(如a:b中前綴是a),那么所查詢節點(注意屬性也可以是節點)的命名空間URI就應該是空值(也是默認值),否則XPath不會返回結果。
上面的XML, 因為節點a和b都有命名空間值,自然XPath查詢不會有結果。
(上面英文還提到如果節點有默認命名空間,那么還得手動向XmlNamespaceManager添加前綴和命名空間值,這個在后面會講的)
在看解決方案前,首先需要能夠辨識XML命名空間,當然辨識XML命名空間值還是很容易的,參考如下XML(這個XML在后面程序中也會用到)
<?xmlversion="1.0" encoding="utf-8"?> <rootxmlns="dotnet" xmlns:w="wpf"> <a>data in a</a> <w:b>data in b</w:b> <cxmlns="silverlight"> <w:d> <e>data in e</e> </w:d> </c> </root>
它的所有XML節點的命名空間如下所示:
<?xmlversion="1.0" encoding="utf-8"?> <rootxmlns="dotnet" xmlns:w="wpf"> <!-- xmlns: dotnet --> <a>data in a</a> <!-- xmlns: dotnet --> <w:b>data in b</w:b> <!-- xmlns: wpf --> <cxmlns="silverlight"> <!-- xmlns: silverlight --> <w:d> <!-- xmlns: wpf --> <e>data in e</e> <!-- xmlns: silverlight --> </w:d> </c> </root>
如果識別XML命名空間沒有問題,那么后面的操作就相當簡單了,你需要記住:在XmlDocument中用XPath查詢某一節點時,只要它的命名空間值不是空值,那么你必須給它一個前綴, 用這個前綴代表這個節點的命名空間值!這些前綴是通過XmlNamespaceManager類添加的,使用時將XmlNamespaceManager 傳入SelectNodes或SelectSingleNode中即可。這也是為什么上面說“如果節點有默認命名空間,那么還得手動向 XmlNamespaceManager添加前綴和命名空間值”的原因。
另外構造一個XmlNamespaceManager需要XmlNameTable對象,這個對象可以從XmlDocument.NameTable和XmlReader.NameTable屬性中得到。
下面我們步入代碼,比如說查詢上面XML中的節點e,分析位置節點e位于:root->c->d->e,然后將所需命名空間值加入到 XmlNamespaceManager中(前綴名稱無所謂,只要在XPath一致即可),查詢即可成功,如下代碼:
/* * 假設上面XML文件在C:\a.txt中 * 下面代碼會查詢目標節點e,并輸出數據:data in e * */ var xmlDoc =newXmlDocument(); xmlDoc.Load(@"C:\a.txt"); //加入命名空間和前綴 var xmlnsm =newXmlNamespaceManager(xmlDoc.NameTable); xmlnsm.AddNamespace("d", "dotnet"); xmlnsm.AddNamespace("s", "silverlight"); xmlnsm.AddNamespace("w", "wpf"); var node = xmlDoc.SelectSingleNode("/d:root/s:c/w:d/s:e", xmlnsm); Console.WriteLine(node.InnerText); //輸出:data in e
以上是XML命名空間節點如何讀取的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。