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
_になります
ここで、すべての属性名を取得するためのクエリ、またはすべての属性名と値を取得するためのクエリを知りたいと思います。
Element1という名前のドキュメント内のすべての要素のすべての属性を選択するには://Element1/@*
。これにより、attributeノードを含む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");
特定の要素の属性を取得するには、その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();
}
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(), ':', .), '_')
)