Maison  >  Article  >  développement back-end  >  Explication détaillée des espaces de noms XML (XML Namespaces) et exemple de code pour les méthodes de lecture de nœuds

Explication détaillée des espaces de noms XML (XML Namespaces) et exemple de code pour les méthodes de lecture de nœuds

黄舟
黄舟original
2017-03-21 16:39:282689parcourir

XML Namespace fournit un moyen d'éviter les conflits de noms d'éléments.

Conflit de noms

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 f5d188ed2c074f8b944552db028f98a1 avec un contenu et des définitions différents.

L'analyseur XML ne peut pas déterminer comment gérer ce type de conflit.

Utilisez des préfixes pour éviter les conflits de noms

Ce document contient des informations dans un tableau :

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

Ce document XML contient des informations sur un meuble :

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

Maintenant, le conflit de nom n'existe plus, car les deux documents utilisent des noms différents pour leurs éléments f5d188ed2c074f8b944552db028f98a1 (fae077d51b591786197c1ce2523c9adb et 299bfef07b13af2d29839455997ed3ff).

En utilisant des préfixes, nous créons deux types différents d'éléments f5d188ed2c074f8b944552db028f98a1

Utilisation des espaces de noms

Ce document XML contient des informations dans un tableau :


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

Ce document XML contient des informations sur un meuble :

d211f0a5ff2d5b27e2098f7409ee5eff
   5131fb50ac43ce34477ae02954db8af8African Coffee Tablef5a770fdb27d1c8ccb50245da14733bf
   b9784418d0fd3658f883ef7bdd1888468037265c5a838e5a28a65a2d8cfbd33e10
   61367a7e112dafa97c77aefb6b2c0f8b120ee55d0d45c3e1c817d93126a37f6bff6
008daa7d50ab7c214b59e96829b07c29

Au lieu d'utiliser simplement un préfixe, nous ajoutons un attribut xmlns à la balise f5d188ed2c074f8b944552db028f98a1, qui donne au préfixe un nom qualifié associé à un espace de noms.

Attribut XML Namespace (xmlns)

L'attribut XML namespace est placé dans la balise d'ouverture de l'élément et utilise la syntaxe suivante :

xmlns:namespace-prefix="namespaceURI"

Lorsque l'espace de noms est défini dans la balise d'ouverture d'un élément, tous les éléments enfants avec le même préfixe sont associés au même espace de noms.

Remarque : L'adresse utilisée pour identifier l'espace de noms ne sera pas utilisée par l'analyseur pour trouver des informations. Son seul objectif est de donner à l'espace de noms un nom unique. Cependant, de nombreuses entreprises utilisent souvent des espaces de noms comme pointeurs vers des pages Web existantes contenant des informations sur l'espace de noms.

Uniform Resource Identifier (URI)

Uniform Resource Identifier est une chaîne de caractères qui peut identifier les ressources Internet. L'URI le plus couramment utilisé est le Uniform Resource Locator (URL) utilisé pour identifier les adresses de domaine Internet. Un autre URI moins couramment utilisé est Uniform Resource Naming (URN) . Dans notre exemple, nous utilisons simplement l'URL.

Espaces de noms par défaut

Définir un espace de noms par défaut pour un élément nous évite le travail d'utilisation de préfixes dans tous les éléments enfants.

Veuillez utiliser la syntaxe suivante :

xmlns="namespaceURI"

Ce document XML contient des informations dans un tableau :


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

Ce document XML contient des informations sur un tableau Informations sur le mobilier :


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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn