2010-10-14 11 views
9

No pude obtener la siguiente expresión xpath para que funcione cuando se establece el prefijo del espacio de nombres de la ruta de acceso xml.xpath expresión de xml con el prefijo del espacio de nombres

/bk:BookStore/bk:Books/bk:Book[text()='Time Machine']

XML es:

<BookStore xmlns:bk="http://www.bookstore.com/book#"> 
    <bk:Books> 
    <bk:Book id="1">Time Machine></bk:Book> 
    </bk:Books> 
</bk:BookStore> 
+0

Publique el código que ejecuta la consulta XPath. – Tomalak

+3

Necesita pasar el enlace prefijo/namespace-URI a su motor XPath. ¿Por qué? Porque los prefijos no son importantes para la prueba de nombre, pero el URI del espacio de nombres sí lo es. Entonces 'a: node' podría seleccionar' b: node' siempre y cuando los prefijos 'a' y' b' estén vinculados al mismo URI de espacio de nombres. –

Respuesta

12

Sin más información acerca de la lengua de acogida (en el que se intenta evaluar expresiones XPath) no es posible proporcionar una recomendación útil.

En general, se necesita "registrar" un espacio de nombre con un administrador de espacio de nombres y esto también asocia un prefijo al espacio de nombres registrado. Luego, usando este objeto NamespaceManager como argumento para el método de evaluación XPath, se puede especificar como argumento para este método una expresión XPath que contenga nombres prefijados por ese prefijo en particular.

Soluciones provisionales:

/*/*[name()='bk:Books']/*[name()='bk:Book' and text()='Time Machine'] 
+0

Estoy usando la firma xml en java. Quiero seleccionar los elementos que se firmarán usando xpath en la sección de transformaciones. ¿Cómo le doy la expresión xpath cuando tengo prefijos y espacios de nombres en mi documento xml? – Ashwin

+1

@Ashwin: Esta respuesta muestra exactamente cómo hacerlo (una de las formas posibles), sin registrar espacios de nombres. La segunda forma posible es registrar el espacio de nombres para prefijar los enlaces en los que se mencionan los nombres de los elementos a los que se hace referencia en la expresión XPath; luego, la expresión XPath puede contener prefijos y ser más legible. Esta segunda forma se debe usar para el espacio de nombres que registra las API proporcionadas por la implementación y se necesita leer la documentación correspondiente. –

24

O incluso mejor (y más portátiles), sin el prefijo innecesaria:

/*/*[local-name()='Books'] ... and so on 

The function local-name ignora cualquier prefijo, que, como se ha dicho correctamente por los comentaristas, puede variar.

+1

¿Por qué alguien menospreció esto? Encontré esta una excelente solución para evitar lidiar con espacios de nombres, que son molestos e innecesarios el 99% del tiempo. – Arne

+0

Si los espacios de nombres son solo un obstáculo que tiene que superar, impuestos sobre usted externamente, como a menudo lo son, entonces este es definitivamente el camino a seguir. – joachim

Cuestiones relacionadas