Heim >Backend-Entwicklung >XML/RSS-Tutorial >Detaillierte Erläuterung von XML-Namespaces (XML-Namespaces) und Beispielcode für Knotenlesemethoden

Detaillierte Erläuterung von XML-Namespaces (XML-Namespaces) und Beispielcode für Knotenlesemethoden

黄舟
黄舟Original
2017-03-21 16:39:282719Durchsuche

XML Namespace bietet eine Möglichkeit, Konflikte bei der Benennung von Elementen zu vermeiden.

Namenskonflikt

In XML werden Elementnamen von Entwicklern definiert. Namenskonflikte treten auf, wenn zwei verschiedene Dokumente denselben Elementnamen verwenden.

Dieses XML-Dokument enthält Informationen in einer Tabelle:

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

Dieses XML-Dokument enthält Informationen über einen Tisch (ein Möbelstück):

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

Wenn diese Werden zwei XML-Dokumente zusammen verwendet, kommt es zu einem Namenskonflikt, da beide Dokumente f5d188ed2c074f8b944552db028f98a1-Elemente mit unterschiedlichem Inhalt und unterschiedlichen Definitionen enthalten.

Der XML-Parser kann nicht bestimmen, wie mit dieser Art von Konflikt umgegangen werden soll.

Verwenden Sie Präfixe, um Namenskonflikte zu vermeiden

Dieses Dokument enthält Informationen in einer Tabelle:

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

Dieses XML-Dokument enthält Informationen über ein Möbelstück:

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

Jetzt besteht der Namenskonflikt nicht mehr, da beide Dokumente unterschiedliche Namen für ihre f5d188ed2c074f8b944552db028f98a1-Elemente verwenden (fae077d51b591786197c1ce2523c9adb und 20e0d2c31ebbe4ee5491ba472c0918be).

Durch die Verwendung von Präfixen erstellen wir zwei verschiedene Arten von f5d188ed2c074f8b944552db028f98a1

Namespaces verwenden

Dieses XML-Dokument enthält Informationen in einer Tabelle:


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

Dieses XML-Dokument enthält Informationen über ein Möbelstück:

d211f0a5ff2d5b27e2098f7409ee5eff
   5131fb50ac43ce34477ae02954db8af8African Coffee Tablef5a770fdb27d1c8ccb50245da14733bf
   b9784418d0fd3658f883ef7bdd1888468037265c5a838e5a28a65a2d8cfbd33e10
   61367a7e112dafa97c77aefb6b2c0f8b120ee55d0d45c3e1c817d93126a37f6bff6
008daa7d50ab7c214b59e96829b07c29

Anstatt nur ein Präfix zu verwenden, fügen wir dem f5d188ed2c074f8b944552db028f98a1-Tag ein xmlns-Attribut hinzu, das dem Präfix einen qualifizierten Namen verleiht, der einem Namespace zugeordnet ist.

XML-Namespace-Attribut (xmlns)

Das XML-Namespace-Attribut wird im Eröffnungs-Tag des Elements platziert und verwendet die folgende Syntax:

xmlns:namespace-prefix="namespaceURI"

Wenn Namespace definiert ist Im Eröffnungs-Tag eines Elements werden alle untergeordneten Elemente mit demselben Präfix demselben Namensraum zugeordnet.

Hinweis: Die zur Identifizierung des Namespace verwendete Adresse wird vom Parser nicht zum Suchen von Informationen verwendet. Sein einziger Zweck besteht darin, dem Namespace einen eindeutigen Namen zu geben. Viele Unternehmen verwenden Namespaces jedoch häufig als Verweise auf tatsächlich vorhandene Webseiten, die Informationen über den Namespace enthalten.

Uniform Resource Identifier (URI)

Uniform Resource Identifier ist eine Zeichenfolge, die Internetressourcen identifizieren kann. Der am häufigsten verwendete URI ist der Uniform Resource Locator (URL), der zur Identifizierung von Internetdomänenadressen verwendet wird. Ein weiterer, weniger häufig verwendeter URI ist Uniform Resource Naming (URN) . In unserem Fall verwenden wir einfach die URL.

Standard-Namespaces

Das Definieren eines Standard-Namespace für ein Element erspart uns die Arbeit, Präfixe in allen untergeordneten Elementen zu verwenden.

Bitte verwenden Sie die folgende Syntax:

xmlns="namespaceURI"

Dieses XML-Dokument enthält Informationen in einer Tabelle:


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

Dieses XML-Dokument enthält Informationen über eine Tabelle. Möbelinformationen:


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

Wie wir alle wissen, kann XmlDocument eine XPathAbfrage ausführen, aber tatsächlich ist die hier erwähnte XPath-Abfrage auf keinen Namespace (keine xmlns-Attribute) beschränkt. Sobald XML mit Namespace gefunden wird, liefert die entsprechende XPath-Abfrage keine Ergebnisse.

Zum Beispiel gibt die folgende XML

<a xmlns="mgen.cnblogs.com">
    <b>ccc</b>
</a>

XPath-Abfrage /a/b null zurück, und wenn keine XMLNs vorhanden sind, wird Knoten b zurückgegeben.

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

bedeutet, dass, wenn dem XPath-Ausdruck kein Präfix vorangestellt ist (das Präfix in a:b ist beispielsweise a), dann der Namespace des abgefragten Knotens (beachten Sie, dass das Attribut kann auch ein Knoten sein) Der URI sollte leer sein (auch der Standardwert), sonst gibt XPath das Ergebnis nicht zurück.

Da im obigen XML die Knoten a und b Namespace-Werte haben, liefert die XPath-Abfrage natürlich keine Ergebnisse.

(Das obige Englisch erwähnte auch, dass, wenn der Knoten einen Standard-Namespace hat, Sie das Präfix und den Namespace-Wert manuell zum XmlNamespaceManager hinzufügen müssen, was später besprochen wird)

Bevor Sie suchen Bei der Lösung müssen Sie zunächst in der Lage sein, den XML-Namespace-Wert zu identifizieren. Sehen Sie sich dazu das folgende XML an (dieses XML wird auch im späteren Programm verwendet). 🎜>

<?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>
Die Benennung aller XML-Knoten. Der Raum lautet wie folgt:

<?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>

Wenn es kein Problem bei der Identifizierung gibt Wenn Sie einen XML-Namespace verwenden, müssen Sie Folgendes beachten:

Wenn Sie XPath zum Abfragen eines Knotens in XmlDocument verwenden, müssen Sie ihm ein Präfix geben, solange sein Namespace-Wert nicht null ist. und verwenden Sie dieses Präfix, um den Namespace-Wert dieses Knotens darzustellen! Diese Präfixe werden über die XmlNamespaceManager-Klasse hinzugefügt. Übergeben Sie bei der Verwendung einfach den XmlNamespaceManager an SelectNodes oder SelectSingleNode. Aus diesem Grund heißt es oben: „Wenn der Knoten einen Standard-Namespace hat, müssen Sie das Präfix und den Namespace-Wert manuell zum XmlNamespaceManager hinzufügen“.

另外构造一个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


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von XML-Namespaces (XML-Namespaces) und Beispielcode für Knotenlesemethoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn