2010-03-17 15 views
5

Ich benutze XPath in Java. Ich möchte alle Attribute (Name & Value) eines Elements erhalten. Ich fand die Abfrage, um die Attributwerte eines Elements zu erhalten, jetzt möchte ich Attributnamen allein oder Namen und Werte in einer einzelnen Abfrage erhalten.Xpath - Wie bekomme ich alle Attributnamen und Werte eines Elements

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

Hier die folgende Abfrage mit Hilfe der alle Attribute erhalten Werte von Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); Mit diesem Format //*/@* Ich kann die Werte erhalten. Ergebnis wäre value1 value2 value3 value4 value5 a123

Jetzt möchte ich die Abfrage kennen, um alle Attributnamen zu erhalten, oder Abfrage, um alle Attribute Name und Wert zu erhalten.

Antwort

22

Um alle Attribute aller Elemente im Dokument namens Element1 auszuwählen: //Element1/@*. Dadurch wird ein Knoten zurückgegeben, der Attribut Knoten enthält. Sie können dann das Knotenset iterieren.

Wenn Sie bereits einen Kontextknoten haben und Ergebnisse darunter suchen möchten, lautet die Abfrage .//Element1/@*. Dies ist normalerweise effizienter als die Abfrage des gesamten Dokuments.

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

Und es kann effizienter sein, alle Elemente eines bestimmten Namens finden getElementsByTagName verwenden.

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

Um die Attribute eines bestimmten Elements zu erhalten, durchlaufen seine Attribute Eigenschaft.

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

große am! Ich habe genau danach gesucht! Vielen Dank! (Btw ... da ist ein Tippfehler, es ist String, nicht String) –

1

Ich hatte es in Oracle Service Bus zu tun und musste mit tun xPath nur einen Cache-Schlüssel und die Lösung, die für mich arbeiten zu erstellen:

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(), ':', .), '_') 
) 
Verwandte Themen