2010-03-17 82 views
5

Estoy usando xpath en java. Quiero obtener todos los atributos (nombre & Valor) de un elemento. Encontré la consulta para obtener los valores de atributo de un elemento, ahora quiero obtener nombres de atributo solo o nombres y valores en una sola consulta.Xpath - Cómo obtener todos los nombres de atributos y valores de un elemento

<Element1 ID="a123" attr1="value1" attr2="value2" attr3="value3" attr4="value4" attr5="value5" /> 

Aquí usando la siguiente consulta para obtener todos los valores de atributo de Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); El uso de este formato //*/@* puedo obtener los valores. resultado sería value1 value2 value3 value4 value5 a123

Ahora quiero saber la consulta para obtener todos los nombres de atributos, o consultar para obtener todos los atributos de nombre y valor.

Respuesta

22

Para seleccionar todos los atributos de todos los elementos en el documento llamado Element1: //Element1/@*. Esto devolverá un nodeset que contiene atributo nodos. Puede iterar el conjunto de nodos.

Si ya tiene un nodo de contexto y desea buscar resultados debajo de él, la consulta sería .//Element1/@*. Esto generalmente es más eficiente que consultar todo el documento.

// input is an InputSource or a DOM node 
NodeList nl = (NodeList) xpath.evaluate("//Element1/@*", input, XPathConstants.NODESET); 
int length = nl.getLength(); 
for(int i=0; i<length; i++) { 
    Attr attr = (Attr) nl.item(i); 
    String name = attr.getName(); 
    String value = attr.getValue(); 
} 

Y puede ser más eficiente para encontrar todos los elementos de un nombre determinado, utilizando getElementsByTagName.

NodeList nl = document.getElementsByTagName("Element1"); 

para obtener los atributos de un elemento en particular, recorrer sus atributos propiedad.

NamedNodeMap nl = element.getAttributes(); 
int length = nl.getLength(); 
for(int i=0; i<length; i++) { 
    Attr attr = (Attr) nl.item(i); 
    String name = attr.getName(); 
    String value = attr.getValue(); 
} 
+0

grandes ans! ¡Estaba buscando exactamente esto! ¡Gracias! (Por cierto ... hay un error tipográfico, es una cadena, no una cadena) –

1

tuve que hacerlo en Oracle Service Bus y tenía que hacer utilizando sólo XPath para crear una clave de caché y la solución que funciona para mí fue:

concat(
    string-join(//*[string-length(normalize-space(string-join(text(), ''))) > 0]/concat(local-name(), 
                         ':', 
                         normalize-space(string-join(text(), ''))), '_'), 
    '_', 
    string-join(//@*[normalize-space(.) != '']/concat(name(), ':', .), '_') 
) 
Cuestiones relacionadas