Existen algunas técnicas que puede probar; que utilice dependerá exactamente de la información que necesita para salir del documento, cuán rigurosa quiere ser y cuán conforme es la implementación de XPath que está utilizando.
Una forma de obtener el URI del espacio de nombres asociado con un prefijo en particular es utilizando el eje namespace::
. Esto le dará un nodo de espacio de nombres cuyo nombre es el prefijo y cuyo valor es el URI del espacio de nombres. Por ejemplo, se puede obtener el espacio de nombres URI por defecto en el elemento de documento utilizando la ruta:
/*/namespace::*[name()='']
es posible que pueda utilizar para establecer que las asociaciones de espacio de nombres para su XPathNavigator. Tenga en cuenta, sin embargo, que el eje namespace::
es una de esas esquinas de XPath 1.0 que no siempre se implementa.
Una segunda manera de conseguir ese URI de espacio es el uso de la función namespace-uri()
en el elemento de documento (que usted ha dicho siempre estará en ese espacio de nombres). La expresión:
namespace-uri(/*)
le dará ese espacio de nombre.
Una alternativa sería olvidarse de asociar un prefijo con ese espacio de nombres, y simplemente hacer su ruta libre de espacio de nombres. Puede hacerlo utilizando la función local-name()
siempre que necesite hacer referencia a un elemento cuyo espacio de nombres no conozca.Por ejemplo:
//*[local-name() = 'Element']
Usted podría ir un paso más allá y probar el URI de espacio del elemento contra la del elemento de documento, si realmente quería:
//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]
Una última opción, teniendo en cuenta que el espacio de nombres parece no significar nada para usted, sería ejecutar su XML a través de un filtro que elimine los espacios de nombres. Entonces no tendrás que preocuparte por ellos en tu XPath en absoluto. La forma más sencilla de hacerlo sería simplemente eliminar el atributo xmlns
con una expresión regular, pero podría hacer algo más complejo si necesitara hacer otra limpieza al mismo tiempo.
¿Están siempre en el espacio de nombres predeterminado? o alguna vez tiene: xmlns: myns = "namespace-uri" ¿También lee los archivos en su totalidad en un documento DOM o analiza usando algo como el XmlValidatingReader? – Kev
Siempre están en el espacio de nombre predeterminado. Todavía no leo el archivo por completo, ya que me quedé atascado en este asunto; Supongo que no entiendo completamente cuando preguntas "en un documento DOM o analiza utilizando algo como XmlValidatingReader"; Usaría XPath solo para leer el XML; ¿es malo? –