Domanda

Sto utilizzando xpath in java.Voglio avere tutti gli attributi (nome e il Valore di un elemento.Ho trovato la query per ottenere i valori degli attributi di un elemento, ora voglio i nomi di attributo da solo o nomi e valori in singola query.

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

Qui, utilizzando la seguente query per ottenere tutti i valori di attributo di Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); Utilizzando questo formato //*/@* Posso ottenere i valori.il risultato sarebbe value1 value2 value3 value4 value5 a123

Ora voglio sapere la query per ottenere tutti i nomi di attributo, o query per ottenere tutti gli attributi nome e valore.

È stato utile?

Soluzione

Per selezionare tutti gli attributi di tutti gli elementi nel documento denominato Element1: //Element1/@*.Questo restituirà un serie di nodi contenente attributo i nodi.È quindi possibile scorrere i set di nodi.

Se si dispone già di un nodo di contesto e desidera trovare risultati sotto di essa, la query sarebbe .//Element1/@*.Questo di solito è più efficiente rispetto a interrogare l'intero 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();
}

E può essere più efficiente per trovare tutti gli elementi di un dato nome utilizzando getElementsByTagName.

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

Per ottenere gli attributi di un elemento in particolare, il suo scorrere attributi proprietà.

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();
}

Altri suggerimenti

Ho avuto a che fare in Oracle Service Bus e aveva a che fare solo utilizzando xPath per creare una chiave di cache e la soluzione che funziona per me è stato:

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(), ':', .), '_')
)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top