Xpath - Come ottenere tutti i nomi degli attributi e valori di un elemento
-
20-09-2019 - |
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.
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(), ':', .), '_')
)