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

黄舟
Libérer: 2017-03-21 16:39:28
original
2679 Les gens l'ont consulté

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>
Copier après la connexion

Ce document XML porte des informations sur une table (un meuble) :

   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
Copier après la connexion

Si ces deux documents XML sont utilisés ensemble, un conflit de nom se produira car les deux documents contiennent des éléments

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>
Copier après la connexion

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>
Copier après la connexion

Maintenant, le conflit de nom n'existe plus, car les deux documents utilisent des noms différents pour leurs éléments

( et ).

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

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>
Copier après la connexion

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>
Copier après la connexion

Au lieu d'utiliser simplement un préfixe, nous ajoutons un attribut xmlns à la balise

, 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"
Copier après la connexion

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"
Copier après la connexion

Ce document XML contient des informations dans un tableau :

<tr> <td>Apples</td> <td>Bananas</td> </tr>
Copier après la connexion

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)
Copier après la connexion

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>
Copier après la connexion

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
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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
Copier après la connexion


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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal