J'ai trouvé un peu sec comme pour pourquoi , tout au moins dans le .Net Framework -- il est nécessaire d'utiliser un XmlNamespaceManager
afin de gérer les espaces de noms (ou plutôt maladroit et détaillé [local-name()=...
XPath prédicat/fonction/whatever) lors de l'exécution de requêtes XPath. Je ne comprends pourquoi les espaces de noms sont nécessaires ou du moins bénéfique, mais pourquoi est-il si complexe?
Pour l'interrogation d'un Document XML simple (pas d'espaces de noms)...
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode>
<nodeName>Some Text Here</nodeName>
</rootNode>
...on peut utiliser quelque chose comme doc.SelectSingleNode("//nodeName")
(qui correspond <nodeName>Some Text Here</nodeName>
)
Mystère #1: Mon premier gêne -- Si je comprends bien, est-ce simplement l'ajout d'une référence d'espace de noms pour les parents/balise racine (si utilisé comme partie d'un nœud enfant de la balise ou pas) comme suit:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns="http://someplace.org">
<nodeName>Some Text Here</nodeName>
</rootNode>
...nécessite plusieurs lignes de code supplémentaires pour obtenir le même résultat:
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ab", "http://s+omeplace.org")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//ab:nodeName", nsmgr)
...de fait, l'idée d'un inexistante préfixe ("ab
") pour trouver un nœud qui n'a même pas d'utiliser un préfixe. Comment cela fait-il sens? Ce qui est faux (conceptuellement) avec doc.SelectSingleNode("//nodeName")
?
Mystère #2: Donc, disons que vous avez un document XML qui utilise les préfixes:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns:cde="http://someplace.org" xmlns:feg="http://otherplace.net">
<cde:nodeName>Some Text Here</cde:nodeName>
<feg:nodeName>Some Other Value</feg:nodeName>
<feg:otherName>Yet Another Value</feg:otherName>
</rootNode>
... Si je comprends bien, vous devez ajouter les deux espaces à l' XmlNamespaceManager
, afin de faire une requête pour un seul nœud...
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("cde", "http://someplace.org")
nsmgr.AddNamespace("feg", "http://otherplace.net")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//feg:nodeName", nsmgr)
... Pourquoi, dans ce cas, ai-je besoin d' (conceptuellement) un espace de noms manager?
**RÉDIGÉ dans les commentaires ci-dessous**
Edit Ajouté: Mon révisé et affiné question est basée sur l'apparente redondance de la XmlNamespaceManager dans ce que je crois être la majorité des cas et l'utilisation de l'espace de noms du gestionnaire de spécifier une correspondance de préfixe à URI:
Lorsque le mappage direct du préfixe d'espace de noms ("cde") à l'espace de noms URI ("http://someplace.org") il est expressément indiqué dans le document source:
...<rootNode xmlns:cde="http://someplace.org"...
qu'est-ce que le conceptuel avoir besoin d'un programmeur pour recréer cette cartographie avant de faire une requête?