我在java中使用xpath。我想获得一个元素的所有属性(name& Value)。我发现查询获取元素的属性值,现在我想在单个查询中单独获取属性名称或名称和值。
<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
现在我想知道获取所有属性名称的查询,或查询获取所有属性的名称和值。
答案 0 :(得分:28)
选择名为Element1的文档中所有元素的所有属性://Element1/@*
。这将返回包含属性节点的 nodeset 。然后,您可以迭代节点集。
如果您已有上下文节点并希望在其下找到结果,则查询将为.//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");
要获取特定元素的属性,请迭代其属性属性。
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();
}
答案 1 :(得分:2)
我必须在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(), ':', .), '_')
)