Question

I am using xpath in java. I want to get all the attributes (name & Value) of an element. I found the query to get the attribute values of an element, now I want to get attribute names alone or names and values in single query.

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

Here using the following query to get all the attribute values of Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); Using this format //*/@* I can get the values. result would be value1 value2 value3 value4 value5 a123

Now I want to know the query to get all the attribute names, or query to get all the attributes name and value.

Was it helpful?

Solution

To select all attributes of all elements in the document named Element1: //Element1/@*. This will return a nodeset containing attribute nodes. You can then iterate the nodeset.

If you already have a context node and wish to find results under it, the query would be .//Element1/@*. This is usually more efficient than querying the entire document.

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

And it may be more efficient to find all elements of a given name using getElementsByTagName.

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

To get the attributes of a particular element, iterate its attributes property.

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

OTHER TIPS

I had to do it in Oracle Service Bus and had to do using only xPath to create a cache key and the solution that work for me was:

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(), ':', .), '_')
)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top