سؤال

أواجه مشكلة السمة باستخدام XPath محدد في ElementTree ، والتي يجب أن تكون قادرة على القيام به وفقا الوثائق

هنا بعض التعليمات البرمجية

XML

<root>
 <target name="1">
    <a></a>
    <b></b>
 </target>
 <target name="2">
    <a></a>
    <b></b>
 </target>
</root>

بيثون

def parse(document):
    root = et.parse(document)
    for target in root.findall("//target[@name='a']"):
        print target._children

أنا تلقي استثناء التالية:

expected path separator ([)
هل كانت مفيدة؟

المحلول

جملة كنت تحاول استخدام هو جديد في ElementTree 1.3.

هذه النسخة هي التي يتم شحنها مع بايثون 2.7 أو أعلى.إذا كان لديك بيثون 2.6 أو أقل لا يزال لديك ElementTree 1.2.6 أو أقل.

نصائح أخرى

هناك عدة مشاكل في هذا القانون.

  1. بايثون تبنوا ElementTree (ET قصيرة) لا XPATH الدعم ؛ فقط مجموعة فرعية محدودة على سبيل المثال, لا يدعم تجد من الجذر عبارات مثل //target.

    إشعار:على الوثائق يذكر "//"،ولكن فقط من أجل الأطفال:لذلك فإن التعبير .//target صالحة ؛ //... هو لا!

    هناك بديل التنفيذ: lxml والتي هي أكثر من الأغنياء.إنها طبقات الوثائق المستخدمة ، في بناء التعليمات البرمجية.التي لا تتناسب مع العمل.

  2. على @name تدوين يختار xmlسمات;على key=value التعبير داخل xml-العلامة.

    حتى أن اسم القيمة يجب أن يكون 1 أو 2 إلى تحديد شيء في الوثيقة.أو يمكن للمرء أن البحث عن أهداف مع الطفل عنصر 'a': target[a] (لا @).

نظرا وثيقة تحليل مع بناء في ElementTree (v1.3) إلى الجذر ، البرمجية التالية هو الصحيح و العمل:

  • root.findall(".//target") البحث عن كل الأهداف
  • root.findall(".//target/a") العثور على اثنين من ألف عنصر
  • root.findall(".//target[a]") هذا يجد كل من الهدف-العنصر مرة أخرى ، كما لكل ألف عنصر
  • root.findall(".//target[@name='1']") البحث فقط أولا الهدف.لاحظ علامات الاقتباس حول 1 هي الحاجة ؛ آخر SyntaxError يتم رفع
  • root.findall(".//target[a][@name='1']") أيضا صحيحة ؛ لتجد أن الهدف
  • root.findall(".//target[@name='1']/a") يجد واحد فقط-العنصر ؛ ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top