溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XML命名空間節(jié)點如何讀取

發(fā)布時間:2020-10-30 12:28:31 來源:億速云 閱讀:364 作者:小新 欄目:編程語言

小編給大家分享一下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> 元素。

使用命名空間(Namespaces)

這個 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 Namespace (xmlns) 屬性

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)識符(Uniform Resource Identifier (URI))

統(tǒng)一資源標(biāo)識符是一串可以標(biāo)識因特網(wǎng)資源的字符。最常用的 URI 是用來標(biāo)示因特網(wǎng)域名地址的統(tǒng)一資源定位器(URL)。另一個不那么常用的 URI 是統(tǒng)一資源命名(URN)。在我們的例子中,我們僅使用 URL。

默認(rèn)的命名空間(Default Namespaces)

為元素定義默認(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è)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

xml
AI