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

黄舟
Freigeben: 2017-03-21 16:39:28
Original
2691 Leute haben es durchsucht

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>
Nach dem Login kopieren

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

   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
Nach dem Login kopieren

Wenn diese Werden zwei XML-Dokumente zusammen verwendet, kommt es zu einem Namenskonflikt, da beide Dokumente

-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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Jetzt besteht der Namenskonflikt nicht mehr, da beide Dokumente unterschiedliche Namen für ihre

-Elemente verwenden ( und ).

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

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Anstatt nur ein Präfix zu verwenden, fügen wir dem

-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"
Nach dem Login kopieren

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"
Nach dem Login kopieren

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

<tr> <td>Apples</td> <td>Bananas</td> </tr>
Nach dem Login kopieren

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)
Nach dem Login kopieren

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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>
Nach dem Login kopieren
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>
Nach dem Login kopieren

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
Nach dem Login kopieren


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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage