Bizarre avec XDocument, XPath et les espaces de noms

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:

  1. L’espace de nom anonyme (pas de préfixe) a le nom d’espace-uri: http://url1
  2. Le préfixe de l’espace de nom env a le nom d’espace de nom-uri: url1

Dans votre XmlNamespaceManager vous avez déclaré:

  1. L’espace de nom anonyme (sans préfixe) a le nom d’espace de nom-uri: http://xml.kerridge.net/k8msg
  2. Le préfixe d’espace de nom env a le nom d’espace de nom-uri: 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.