XML Namespace bietet eine Möglichkeit, Konflikte bei der Benennung von Elementen zu vermeiden.
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
Dieses XML-Dokument enthält Informationen über eine Tabelle. Möbelinformationen:
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>
<?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!