XPath - كيفية الحصول على جميع أسماء السمات وقيم عنصر ما
-
20-09-2019 - |
سؤال
أنا أستخدم XPath في Java. أريد الحصول على جميع سمات (الاسم والقيمة) لعنصر. لقد وجدت الاستعلام للحصول على قيم السمة لعنصر ما ، وأريد الآن الحصول على أسماء السمات وحدها أو الأسماء والقيم في استعلام واحد.
<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
الآن أريد أن أعرف الاستعلام للحصول على جميع أسماء السمات ، أو الاستعلام للحصول على جميع السمات والقيمة.
المحلول
لتحديد جميع سمات جميع العناصر في المستند المسماة العنصر 1: //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");
للحصول على سمات عنصر معين ، تكرارها صفات منشأه.
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(), ':', .), '_')
)