ホームページ >バックエンド開発 >XML/RSS チュートリアル >XML名前空間(XML Namespaces)の詳しい説明とノード読み取り方法のサンプルコード

XML名前空間(XML Namespaces)の詳しい説明とノード読み取り方法のサンプルコード

黄舟
黄舟オリジナル
2017-03-21 16:39:282718ブラウズ

XML 名前空間 は、要素の名前の競合を回避する方法を提供します。

名前の競合

XML では、要素名は開発者によって定義されます。2 つの異なるドキュメントが同じ要素名を使用すると、名前の競合が発生します。

この XML ドキュメントはテーブル内の情報を伝えます:

   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>

この XML ドキュメントはテーブル (家具) に関する情報を伝えます:

   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>

これら 2 つの 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>

現在、名前の競合は存在しません。これは両方のドキュメントが原因です。 f5d188ed2c074f8b944552db028f98a1 要素 (fae077d51b591786197c1ce2523c9adb と 20e0d2c31ebbe4ee5491ba472c0918be) に異なる名前を使用します。

接頭辞を使用して、2 つの異なるタイプの f5d188ed2c074f8b944552db028f98a1 要素を作成します。

名前空間の使用

この XML ドキュメントは、テーブル内の情報を伝えます:


   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>

この XML ドキュメントは、家具に関する情報を伝えます:

d211f0a5ff2d5b27e2098f7409ee5eff
   5131fb50ac43ce34477ae02954db8af8African Coffee Tablef5a770fdb27d1c8ccb50245da14733bf
   b9784418d0fd3658f883ef7bdd1888468037265c5a838e5a28a65a2d8cfbd33e10
   61367a7e112dafa97c77aefb6b2c0f8b120ee55d0d45c3e1c817d93126a37f6bff6
008daa7d50ab7c214b59e96829b07c29

接頭辞を使用する代わりに、43c4707103c6cc3650c2aeb71d2b1e8d を追加します。属性。名前空間に関連付けられた修飾名をプレフィックスに与えます。

XML 名前空間 (xmlns) 属性

XML 名前空間属性は要素の開始タグに配置され、次の構文を使用します:

xmlns:namespace-prefix="namespaceURI"

名前空間が要素の開始タグで定義されている場合、すべての属性は同じですプレフィックスの子要素はすべて同じ名前空間に関連付けられます。

注: 名前空間の識別に使用されるアドレスは、パーサーが情報を検索するために使用されることはありません。その唯一の目的は、名前空間に一意の名前を付けることです。ただし、多くの企業は、名前空間に関する情報を含む実際の既存の Web ページへのポインターとして名前空間を使用することがよくあります。

Uniform Resource Identifier (URI)

Uniform Resource Identifier は、インターネット リソースを識別できる文字列です。最も一般的に使用される URI は、インターネット ドメイン アドレスを識別するために使用される Uniform Resource Locator (URL) です。あまり一般的には使用されないもう 1 つの URI は、Uniform Resource Naming (URN) です。この例では、URL のみを使用します。

デフォルトの名前空間

要素のデフォルトの名前空間を定義すると、すべての子要素で接頭辞を使用する手間が省けます。

次の構文を使用してください:

xmlns="namespaceURI"

この XML ドキュメントは、テーブル内の情報を伝えます:


   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>

この XML ドキュメントは、家具に関する情報を伝えます:


   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
(转原文http://www.cnblogs.com/mgen/archive/2011/05/24/2056025.html)

ご存知のとおり、XmlDocument は XPath クエリを実行できます。 ただし、実際には、ここで説明する XPath クエリは、名前空間のない XML (xmlns 属性なし) に限定されます。名前空間のある 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

は、XPathexpression にプレフィックスが付いていない場合 (たとえば、a:b のプレフィックスが a である場合)、クエリされたノードの名前空間 URI (属性がノードである場合もあることに注意してください) が空である必要があることを意味します(デフォルト値も)、そうでない場合、XPath は結果を返しません。

上記の XML では、ノード a と b に名前空間値があるため、当然ながら XPath クエリには結果がありません。

(上記の英語では、ノードにデフォルトの名前空間がある場合、プレフィックスと名前空間の値を XmlNamespaceManager に手動で追加する必要があるとも述べています。これについては後で説明します)

解決策を検討する前に、まず次のことを行う必要があります。もちろん、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 名前空間には問題がないため、その後の操作は非常に簡単です: XPath を使用して XmlDocument 内のノードをクエリする場合、その名前空間が存在する限り。 value が null ではない場合は、接頭辞を付ける必要があります。この接頭辞を使用して、このノードの名前空間値を表します。これらのプレフィックスは、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名前空間(XML Namespaces)の詳しい説明とノード読み取り方法のサンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。