cómo ignorar los espacios de nombres con XPath

Mi objective es extraer ciertos nodos de múltiples archivos xml con múltiples espacios de nombres usando XPath. Todo funciona bien, siempre que conozca los URI del espacio de nombre. El nombre del espacio de nombres en sí permanece constante, pero los Esquemas (XSD) a veces son generados por el cliente, es decir, desconocidos para mí. Entonces me quedan básicamente tres opciones:

  1. use solo un esquema para el espacio de nombres, esperando que nada salga mal (¿puedo estar seguro?)

  2. obtener los nodos secundarios del documento y buscar el primer nodo con un URI de espacio de nombres, con la esperanza de que esté allí y simplemente usar el URI, esperando que sea el correcto. puede salir mal por múltiples razones

  3. de alguna manera, dile a xpath: “mira, no me importan los espacios de nombres, solo encuentro TODOS los nodos con este nombre, incluso puedo decirte el nombre del espacio de nombres, pero no el URI”. Y esta es la pregunta aquí …

Esto no es una reiteración de numerosas preguntas de “mi expresión xpath no funciona porque no estoy al tanto de la conciencia del espacio de nombres” que se encuentran aquí o aquí . Sé cómo usar la conciencia del espacio de nombres. Simplemente no cómo deshacerse de eso.

Puede usar la función XPath de local-name() . En lugar de seleccionar un nodo como

 /path/to/x:somenode 

puede seleccionar todos los nodos y filtrar el que tiene el nombre local correcto:

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

Puede hacer lo mismo en XPath2.0 en una syntax menos detallada:

 /path/to/*:somenode 

Podría usar Namespace = false en un XmlTextReader

 [TestMethod] public void MyTestMethod() { string _withXmlns = @"< ?xml version=""1.0"" encoding=""utf-8""?>    "; 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.Attribute("value").Value.Should().Be("ID123456"); } 

con :

 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;