13

我在java中使用xpath。我想获取元素的所有属性(名称和值)。我找到了获取元素属性值的查询,现在我想单独获取属性名称或单个查询中的名称和值。

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

这里使用以下查询来获取Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); 使用这种格式的所有属性值,//*/@*我可以获得值。结果是value1 value2 value3 value4 value5 a123

现在我想知道获取所有属性名称的查询,或获取所有属性名称和值的查询。

4

2 回答 2

34

选择名为 Element1 的文档中所有元素的所有属性://Element1/@*. 这将返回一个包含属性节点的节点集。然后,您可以迭代节点集。

如果您已经有一个上下文节点并希望在其下查找结果,则查询将为.//Element1/@*. 这通常比查询整个文档更有效。

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

使用getElementsByTagName查找给定名称的所有元素可能更有效。

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

要获取特定元素的属性,请迭代其attributes属性。

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();
}
于 2010-03-17T08:33:30.753 回答
1

我必须在 Oracle Service Bus 中执行此操作,并且必须仅使用 xPath 来创建缓存键,并且对我有用的解决方案是:

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(), ':', .), '_')
)
于 2015-06-06T14:24:40.813 回答