Comment ignorer les espaces de noms avec XPath

Mon objective est d’extraire certains nœuds de plusieurs fichiers XML avec plusieurs espaces de noms à l’aide de XPath. Tout fonctionne bien tant que je connais les URI de l’espace de noms. Le nom de l’espace de nom lui-même rest constant, mais les schémas (XSD) sont parfois générés par le client, c’est-à-dire inconnus pour moi. Ensuite, il me rest essentiellement trois choix:

  1. n’utiliser qu’un seul schéma pour l’espace de noms, en espérant que rien ne se passe mal (puis-je être sûr?)

  2. récupère les nœuds enfants du document et cherche le premier nœud avec un URI d’espace de nom, en espérant que celui-ci soit là et utilise l’URI, en espérant que ce soit le bon. peut se tromper pour plusieurs raisons

  3. en quelque sorte dire à xpath: “regardez, je ne me soucie pas des espaces de noms, il suffit de trouver tous les nœuds avec ce nom, je peux même vous dire le nom de l’espace de noms, mais pas l’URI”. Et c’est la question ici …

Ceci n’est pas une réitération de nombreuses “mon expression xpath ne fonctionne pas parce que je ne suis pas au courant de la conscience de l’espace de nommage”, comme ici ou ici . Je sais utiliser la connaissance de l’espace de noms. Juste pas comment s’en débarrasser.

Vous pouvez utiliser la fonction XPath local-name() . Au lieu de sélectionner un nœud comme

 /path/to/x:somenode 

vous pouvez sélectionner tous les nœuds et filtrer pour celui qui porte le nom local correct:

 /path/to/*[local-name() = 'somenode'] 

Vous pouvez faire la même chose dans XPath2.0 avec une syntaxe moins détaillée:

 /path/to/*:somenode 

Vous pouvez utiliser Namespace = false sur un XmlTextReader

 [TestMethod] public void MyTestMethod() { ssortingng _withXmlns = @"    "; var xmlReader = new XmlTextReader(new MemoryStream(Encoding.Default.GetBytes(_withXmlns))); xmlReader.Namespaces = false; var content = XElement.Load(xmlReader); XElement elem = content.XPathSelectElement("/Identification"); elem.Should().NotBeNull(); elem.Atsortingbute("value").Value.Should().Be("ID123456"); } 

avec :

 using System; using System.IO; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; using System.Xml.XPath; using FluentAssertions; using Microsoft.VisualStudio.TestTools.UnitTesting;