هل يمكن لـ XPath إرجاع العقد التي لها فرع X فقط؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

هل من الممكن استخدام XPath لتحديد العقد التي تحتوي على عناصر فرعية معينة فقط؟على سبيل المثال، من ملف XML هذا، أريد فقط العناصر الموجودة في الحيوانات الأليفة التي لها فرع "bar".وبالتالي فإن مجموعة البيانات الناتجة ستحتوي على lizard و pig عناصر من هذا المثال:

<pets>
  <cat>
    <foo>don't care about this</foo>
  </cat>
  <dog>
   <foo>not this one either</foo>
  </dog>
  <lizard>
   <bar>lizard should be returned, because it has a child of bar</bar>
  </lizard>
  <pig>
   <bar>return pig, too</bar>
  </pig>
</pets>

هذا Xpath يعطيني جميع الحيوانات الأليفة: "/pets/*", ، لكنني أريد فقط الحيوانات الأليفة التي لها عقدة فرعية من الاسم 'bar'.

هل كانت مفيدة؟

المحلول

هنا هو في كل مجدها

/pets/*[bar]

إنجليزي:أعطني جميع أطفال pets التي لديها طفل bar

نصائح أخرى

/pets/child::*[child::bar]

عذرا، لم أرى التعليقات على الرد السابق.

لكن في هذه الحالة أفضّل استخدام descendant:: المحور، الذي يتضمن كافة العناصر أسفل من المحدد:

/pets[descendant::bar]

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

مثال:

<pets>
    <cat>
        <foo>don't care about this</foo>
    </cat>
    <dog>
        <foo>not this one either</foo>
    </dog>
    <lizard>
        <bar att="baz">lizard should be returned, because it has a child of bar</bar>
    </lizard>
    <pig>
        <bar>don't return pig - it has no att=bar </bar>
    </pig>
</pets>

الآن، أنت تهتم فقط بالجميع pets وجود أي طفل bar الذي له سمة att مع القيمة baz.يمكنك استخدام تعبير xpath التالي:

//pets/*[descendant::bar[@att='baz']]

نتيجة

<lizard>
    <bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top