ما هو XPath الصحيح لاختيار السمات التي تحتوي على "foo"؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

بالنظر إلى ملف XML هذا، فإن ما يقوم XPath بإرجاع كافة العناصر التي prop تحتوي السمة Foo (العقد الثلاثة الأولى):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
هل كانت مفيدة؟

المحلول

//a[contains(@prop,'Foo')]

يعمل إذا استخدمت XML هذا للحصول على النتائج مرة أخرى.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

يحرر:شيء آخر يجب ملاحظته هو أنه على الرغم من أن XPath أعلاه سيعيد الإجابة الصحيحة لملف XML المحدد، إذا كنت تريد ضمان حصولك فقط على العناصر "a" في العنصر "bla"، فيجب عليك كما ذكر الآخرون استخدام

/bla/a[contains(@prop,'Foo')]

سيؤدي هذا إلى البحث في جميع العناصر "a" في مستند xml بأكمله، بغض النظر عن كونها متداخلة في عنصر "blah"

//a[contains(@prop,'Foo')]  

لقد أضفت هذا من أجل الدقة وبروح تدفق المكدس.:)

نصائح أخرى

سيمنحك XPath جميع العقد التي تحتوي على سمات تحتوي على "Foo" بغض النظر عن اسم العقدة أو اسم السمة:

//attribute::*[contains(., 'Foo')]/..

بالطبع، إذا كنت مهتمًا أكثر بمحتويات السمة نفسها، وليس بالضرورة العقدة الأصلية، فما عليك سوى إسقاط /..

//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]

أو:

/bla/a[contains(@prop,'Foo')]

أو:

/bla/a[position() <= 3]

تشريح:

descendant-or-self::

المحور - ابحث في كل عقدة تحتها والعقدة نفسها.غالبًا ما يكون من الأفضل قول هذا بدلاً من //.لقد واجهت بعض التطبيقات حيث // تعني في أي مكان (مشتق أو ذاتي للعقدة الجذرية).والآخر يستخدم المحور الافتراضي.

* or /bla/a

العلامة - مطابقة حرف البدل، و/bla/a هو المسار المطلق.

[contains(@prop,'Foo')] or [position() <= 3]

الشرط داخل [ ].@prop هو اختصار للسمة::prop، لأن السمة هي محور بحث آخر.وبدلاً من ذلك، يمكنك تحديد الثلاثة الأولى باستخدام وظيفة الموضع ().

John C هو الأقرب، لكن XPath حساس لحالة الأحرف، لذا سيكون XPath الصحيح هو:

/bla/a[contains(@prop, 'Foo')]

هل جربت شيئًا مثل:

//أ[يحتوي على(@prop, "Foo")]

لم أستخدم وظيفة الاحتواء مطلقًا من قبل ولكني أشك في أنها يجب أن تعمل كما هو معلن عنها ...

إذا كنت بحاجة أيضًا إلى مطابقة محتوى الرابط نفسه، فاستخدم النص ():

//a[contains(@href,"/some_link")][text()="Click here"]

/bla/a[يحتوي على(@prop, "foo")]

بالنسبة للكود أعلاه ...//*[يحتوي على(@prop,'foo')]

جرب هذا:

//أ[يحتوي على(@prop,'foo')]

يجب أن يعمل هذا مع أي علامات "a" في المستند

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top