XPath - كيفية الحصول على جميع أسماء السمات وقيم عنصر ما

StackOverflow https://stackoverflow.com/questions/2460592

سؤال

أنا أستخدم 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(), ':', .), '_')
)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top