2 votes

Comment gérer une balise XML avec un deux-points en C# avec un XPATH de nom local

Il s'agit d'une version simplifiée d'un système plus complexe XML que je dois gérer avec C# .

Le problème est que lorsque j'essaie d'accéder à une balise à l'intérieur d'un espace de nom, la balise XPATH ne fonctionne pas.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><s:SessionID>abcde</s:SessionID></s:Body>");
string xpath = "//*[local-name()='s:SessionID']";
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText);
//Object reference not set to an instance of an object

Mais le code fonctionne parfaitement sans les deux-points sur la balise.

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("<s:Body xmlns:s=\"sssssss\"><SessionID>abcde</SessionID></s:Body>");
string xpath = "//*[local-name()='SessionID']";
Context.UserLogger.Info(xmlDoc.SelectSingleNode(xpath).InnerText);
//abcde

Je me suis assuré sur un validateur XPATH que le "//*[local-name()='s:SessionID']" fonctionne bien.

Qu'est-ce que je rate ?

Merci d'avance,

J'ai lu des informations sur XmlNamespaceManager mais je préférerais utiliser des chemins "directs". Le XML est plein de NameSpaces et il est dynamique, donc sa structure change assez souvent.

0voto

gtosto Points 11

La fonction local-name() renvoie à seulement la partie locale d'un nom de balise qui dans votre cas est exactement SessionID C'est pourquoi l'expression '//*[local-name()='s:SessionID']' ne fonctionne pas (vous devez comparer des noms qualifiés et pas seulement des chaînes de caractères). D'après votre question, il me semble que vous êtes intéressé par la sélection des éléments SessionsID, si c'est le cas, utilisez l'expression xpath suivante

string xpath = "//s:SessionID";

Si cela ne fonctionne pas, vous devez probablement lier le préfixe s avec l'uri de l'espace de nom s=\"sssssss\" (d'après votre exemple).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X