Mi objetivo es extraer ciertos nodos de múltiples archivos xml con múltiples espacios de nombres usando XPath. Todo funciona bien siempre que sepa los URI del espacio de nombres. 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:
use solo un esquema para el espacio de nombres, esperando que nada salga mal (¿puedo estar seguro?)
obtenga los nodos secundarios del documento y busque el primer nodo con un URI de espacio de nombres, esperando que esté allí y solo use el URI, esperando que sea el correcto. puede salir mal por varias razones
de alguna manera dile a xpath: "mira, no me preocupan los espacios de nombres, solo encuentra 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í ...
Esta 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" como se encuentran aquí o aquí . Sé cómo utilizar el conocimiento del espacio de nombres. Simplemente no cómo deshacerse de él.
fuente
Respuestas:
Puede utilizar la
local-name()
función XPath. En lugar de seleccionar un nodo comopuede seleccionar todos los nodos y filtrar por el que tenga el nombre local correcto:
fuente
local-name()
para referirse a los atributos, sin tener en cuenta el espacio de nombres, consulte: stackoverflow.com/q/21239181/274677Puede hacer lo mismo en XPath2.0 con una sintaxis menos detallada:
fuente
Puede usar Namespace = false en un XmlTextReader
con :
fuente
'The 'xmlns' attribute is bound to the reserved namespace
error.O puede usar name ():
O solo buscar atributos:
Si abre el xml como un objeto de PowerShell, ignora los espacios de nombres:
fuente
Es mi ejemplo en Qt C ++. Qt es compatible con XPath 2.0:
Salida del programa:
"1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5\n"
Plane.dae
fuente