XML Namespace fournit un moyen d'éviter les conflits de noms d'éléments.
En XML, les noms d'éléments sont définis par les développeurs. Des conflits de noms se produisent lorsque deux documents différents utilisent le même nom d'élément.
Ce document XML porte des informations dans un tableau :
<tr> <td>Apples</td> <td>Bananas</td> </tr>
Ce document XML porte des informations sur une table (un meuble) :
<name>African Coffee Table</name> <width>80</width> <length>120</length>
Si ces deux documents XML sont utilisés ensemble, un conflit de nom se produira car les deux documents contiennent des éléments
Ce document XML contient des informations sur un tableau Informations sur le mobilier :
Comme nous le savons tous, XmlDocument peut effectuer une XPathrequête, mais en fait la requête XPath mentionnée ici n'est limitée à aucun espace de noms (pas d'attributs xmlns) , une fois que XML avec espace de noms est rencontré, la requête XPath correspondante n'aura aucun résultat.
Par exemple, la requête XML
<a xmlns="mgen.cnblogs.com"> <b>ccc</b> </a>
XPath /a/b suivante renverra null, et s'il n'y a pas de xmlns, le nœud b sera renvoyé.
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
signifie que si l'expression XPath n'est pas préfixée (par exemple, le préfixe dans a:b est a), alors l'espace de noms du nœud interrogé (notez que l'attribut peut également être un nœud) L'URI doit être vide (également la valeur par défaut), sinon XPath ne renverra pas le résultat.
Dans le XML ci-dessus, étant donné que les nœuds a et b ont des valeurs d'espace de noms, la requête XPath n'aura naturellement aucun résultat.
(L'anglais ci-dessus mentionne également que si le nœud a un espace de noms par défaut, vous devez alors ajouter manuellement le préfixe et la valeur de l'espace de noms au XmlNamespaceManager, qui sera discuté plus tard)
Avant de chercher à la solution, tout d'abord, vous devez être capable d'identifier l'espace de noms XML. Bien sûr, il est toujours très facile d'identifier la valeur de l'espace de noms XML. Reportez-vous au XML suivant (ce XML sera également utilisé dans le programme ultérieur). )
<?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>
Le nommage de tous ses nœuds XML L'espace est le suivant :
<?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>
S'il n'y a pas de problème dans identifiant l'espace de noms XML, les opérations suivantes sont assez simples. Vous devez vous rappeler : Lorsque vous utilisez XPath pour interroger un nœud dans XmlDocument, tant que sa valeur d'espace de noms n'est pas nulle, vous devez lui donner un préfixe , et utilisez ce préfixe pour représenter la valeur de l'espace de noms de ce nœud ! Ces préfixes sont ajoutés via la classe XmlNamespaceManager Lors de l'utilisation, transmettez simplement le XmlNamespaceManager dans SelectNodes ou SelectSingleNode. C'est pourquoi il est dit ci-dessus que "Si le nœud a un espace de noms par défaut, vous devez ajouter manuellement le préfixe et la valeur de l'espace de noms au 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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!