J’ai un document XML qui ressemble à ceci:
Il n’a pas de schéma disponible malgré les espaces de noms spécifiés (je l’obtiens d’une source externe donc je n’ai aucun contrôle). Je l’parsing avec un XDocument, mais continue d’obtenir des valeurs NULL pour les éléments qui ne se trouvent pas dans l’espace de noms env. Je configure le XDocument comme ceci:
XDocument Source = XDocument.Load("Testfile.xml"); XmlNamespaceManager oManager = new XmlNamespaceManager(new NameTable()); oManager.AddNamespace(Ssortingng.Empty, "http://xml.kerridge.net/k8msg"); oManager.AddNamespace("env", "http://xml.kerridge.net/k8msgEnvelope");
Ensuite, j’essaie d’obtenir des valeurs:
? Source.XPathSelectElement (“// kmsg”, oManager)
nul
? Source.XPathSelectElement (“// en-tête”, oManager)
nul
? Source.XPathSelectElement (“// env: source”, oManager)
Obtient le noeud correctement
Je suppose que cela a quelque chose à voir avec le fait que j’ai mal configuré le gestionnaire d’espaces de noms, mais je ne vois pas comment le réparer. Toute aide est la bienvenue.
Merci
Outre la remarque correcte de @ Mads-Hansen, vous rencontrez le problème typique de ne pas définir de préfixe (non vide) pour l’un des espaces de noms.
N’oubliez pas : XPath considère que tout nom non préfixé est dans “aucun espace de nom”
Donc c’est faux :
Source.XPathSelectElement("//kmsg", oManager)
Cette expression XPath veut sélectionner tous les éléments kmsg
qui se trouvent dans “aucun espace de nom” et ne sélectionne correctement rien car les éléments kmsg
du document XML fourni se trouvent dans l’espace de nom "http://url1"
et non dans “aucun espace de nom”. .
Pour le faire correctement :
oManager.AddNamespace("xxx", "http://url1"); Source.XPathSelectElement("//xxx:kmsg", oManager)
Les URI d’espace de nom déclarés dans votre code XML source ne correspondent pas à l’URI d’espace de nom que vous inscrivez auprès de XmlNamespaceManager
.
Dans votre source XML:
http://url1
url1
Dans votre XmlNamespaceManager
vous avez déclaré:
http://xml.kerridge.net/k8msg
http://xml.kerridge.net/k8msgEnvelope
Les valeurs de namespace-uri doivent correspondre, sinon vous sélectionnez des noms d’élément différents et vous n’obtiendrez jamais de correspondance.