test namespace examples ejemplo checker xml xpath namespaces

namespace - xpath xml



XPath: busca elementos por espacio de nombres de atributos (4)

Intento usar XPath para encontrar todos los elementos que tienen un elemento en un espacio de nombres dado.

Por ejemplo, en el siguiente documento quiero encontrar los elementos foo: bar y doodah

<?xml version="1.0" encoding="UTF-8"?> <root xmlns:foo="http://foo.example.com"> <foo:bar quux="value">Content</foo:bar> <widget>Content</widget> <doodah foo:quux="value">Content</doodah> </root>

Sé que puedo usar la siguiente expresión XPath para cargar todos los atributos de un espacio de nombres dado

"//@*[namespace-uri()=''http://foo.example.com'']"

Sin embargo:

  • Esto no me da los elementos, solo los atributos y
  • donde los elementos contienen múltiples atributos de ese espacio de nombres, este XPath devolverá un resultado por atributo en lugar de por elemento

¿Es posible obtener lo que quiero, o simplemente tengo que reunir los atributos y calcular el conjunto único de elementos a los que corresponden?

EDIT: Dimitre Novatchev me dio la siguiente respuesta. No me di cuenta de que puedes anidar predicados dentro de predicados como este:

"//*[@*[namespace-uri()=''http://foo.example.com'']]"

Específicamente, esto dice "Cualquier elemento que tenga cualquier atributo que tenga namespace-uri = ''...''"


No estoy seguro de si esto es lo que quiere decir, pero al eliminar 1 char en su XPath obtiene todos los elementos en un determinado espacio de nombres:

//*[namespace-uri()=''http://foo.example.com'']


Su expresión XPath es casi perfecta. En lugar de pedir los atributos "@ ", pide elementos " " y debería funcionar:

"//*[namespace-uri()=''http://foo.example.com'']"


Utilizar:

//*[namespace-uri()=''yourNamespaceURI-here'' or @*[namespace-uri()=''yourNamespaceURI-here''] ]

las dos condiciones del predicado se editan con el XPath or operador.

La expresión XPath selecciona así cualquier elemento que :

  • pertenece al espacio de nombres especificado

o

  • tiene atributos que pertenecen al espacio de nombres especificado

Tu podrías intentar

//*[namespace-uri()=''http://foo.example.com'' or @*[namespace-uri()=''http://foo.example.com'']]

Le dará elementos foo: bar y elemento doodah (si cambia tal:quux a foo:quux en sus datos XML):

<?xml version="1.0" encoding="UTF-8"?> <root xmlns:foo="http://foo.example.com" xmlns:tal="xxx"> <foo:bar quux="value">Content</foo:bar> <widget>Content</widget> <doodah foo:quux="value">Content</doodah> </root>

¿Es eso lo que quieres?

EDITAR : Gracias por detectar el error del atributo, corregido ahora.