您好,登錄后才能下訂單哦!
小編給大家分享一下XML命名空間節(jié)點如何讀取,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
XML 命名空間提供避免元素命名沖突的方法。
在 XML 中,元素名稱是由開發(fā)者定義的,當(dāng)兩個不同的文檔使用相同的元素名時,就會發(fā)生命名沖突。
這個 XML 文檔攜帶著某個表格中的信息:
<tr> <td>Apples</td> <td>Bananas</td> </tr>
這個 XML 文檔攜帶有關(guān)桌子的信息(一件家具):
<name>African Coffee Table</name> <width>80</width> <length>120</length>
假如這兩個 XML 文檔被一起使用,由于兩個文檔都包含帶有不同內(nèi)容和定義的 <table> 元素,就會發(fā)生命名沖突。
XML 解析器無法確定如何處理這類沖突。
此文檔帶有某個表格中的信息:
<h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr>
此 XML 文檔攜帶著有關(guān)一件家具的信息:
<f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length>
現(xiàn)在,命名沖突不存在了,這是由于兩個文檔都使用了不同的名稱來命名它們的 <table> 元素 (<h:table> 和 <f:table>)。
通過使用前綴,我們創(chuàng)建了兩種不同類型的 <table> 元素。
這個 XML 文檔攜帶著某個表格中的信息:
<h:table > <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
此 XML 文檔攜帶著有關(guān)一件家具的信息:
<f:table > <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
與僅僅使用前綴不同,我們?yōu)?<table> 標(biāo)簽添加了一個 xmlns 屬性,這樣就為前綴賦予了一個與某個命名空間相關(guān)聯(lián)的限定名稱。
XML 命名空間屬性被放置于元素的開始標(biāo)簽之中,并使用以下的語法:
xmlns:namespace-prefix="namespaceURI"
當(dāng)命名空間被定義在元素的開始標(biāo)簽中時,所有帶有相同前綴的子元素都會與同一個命名空間相關(guān)聯(lián)。
注釋:用于標(biāo)示命名空間的地址不會被解析器用于查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。不過,很多公司常常會作為指針來使用命名空間指向?qū)嶋H存在的網(wǎng)頁,這個網(wǎng)頁包含關(guān)于命名空間的信息。
統(tǒng)一資源標(biāo)識符是一串可以標(biāo)識因特網(wǎng)資源的字符。最常用的 URI 是用來標(biāo)示因特網(wǎng)域名地址的統(tǒng)一資源定位器(URL)。另一個不那么常用的 URI 是統(tǒng)一資源命名(URN)。在我們的例子中,我們僅使用 URL。
為元素定義默認(rèn)的命名空間可以讓我們省去在所有的子元素中使用前綴的工作。
請使用下面的語法:
xmlns="namespaceURI"
這個 XML 文檔攜帶著某個表格中的信息:
<table > <tr> <td>Apples</td> <td>Bananas</td> </tr> </table>
此 XML 文檔攜帶著有關(guān)一件家具的信息:
<table > <name>African Coffee Table</name> <width>80</width> <length>120</length> </table> (轉(zhuǎn)原文http://www.cnblogs.com/mgen/archive/2011/05/24/2056025.html)
眾所周知,XmlDocument可以進(jìn)行XPath查詢,但實際上這里所說的XPath查詢僅限于沒有命名空間(沒有xmlns屬性)的XML,一旦遇到有命名空間的XML,對應(yīng)XPath查詢都會無結(jié)果。
比如下面這個XML
<a xmlns="mgen.cnblogs.com"> <b>ccc</b> </a>
XPath查詢/a/b會返回null,而如果沒有xmlns的話,會返回節(jié)點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表達(dá)式?jīng)]有加前綴(如a:b中前綴是a),那么所查詢節(jié)點(注意屬性也可以是節(jié)點)的命名空間URI就應(yīng)該是空值(也是默認(rèn)值),否則XPath不會返回結(jié)果。
上面的XML, 因為節(jié)點a和b都有命名空間值,自然XPath查詢不會有結(jié)果。
(上面英文還提到如果節(jié)點有默認(rèn)命名空間,那么還得手動向XmlNamespaceManager添加前綴和命名空間值,這個在后面會講的)
在看解決方案前,首先需要能夠辨識XML命名空間,當(dāng)然辨識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節(jié)點的命名空間如下所示:
<?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命名空間沒有問題,那么后面的操作就相當(dāng)簡單了,你需要記?。?strong>在XmlDocument中用XPath查詢某一節(jié)點時,只要它的命名空間值不是空值,那么你必須給它一個前綴, 用這個前綴代表這個節(jié)點的命名空間值!這些前綴是通過XmlNamespaceManager類添加的,使用時將XmlNamespaceManager 傳入SelectNodes或SelectSingleNode中即可。這也是為什么上面說“如果節(jié)點有默認(rèn)命名空間,那么還得手動向 XmlNamespaceManager添加前綴和命名空間值”的原因。
另外構(gòu)造一個XmlNamespaceManager需要XmlNameTable對象,這個對象可以從XmlDocument.NameTable和XmlReader.NameTable屬性中得到。
下面我們步入代碼,比如說查詢上面XML中的節(jié)點e,分析位置節(jié)點e位于:root->c->d->e,然后將所需命名空間值加入到 XmlNamespaceManager中(前綴名稱無所謂,只要在XPath一致即可),查詢即可成功,如下代碼:
/* * 假設(shè)上面XML文件在C:\a.txt中 * 下面代碼會查詢目標(biāo)節(jié)點e,并輸出數(shù)據(jù):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命名空間節(jié)點如何讀取的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。