ElementTree XPath - حدد عنصر استنادا إلى السمة
-
03-07-2019 - |
سؤال
أواجه مشكلة السمة باستخدام 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 أو أقل.
نصائح أخرى
هناك عدة مشاكل في هذا القانون.
بايثون تبنوا ElementTree (ET قصيرة) لا XPATH الدعم ؛ فقط مجموعة فرعية محدودة على سبيل المثال, لا يدعم تجد من الجذر عبارات مثل
//target
.إشعار:على الوثائق يذكر "//"،ولكن فقط من أجل الأطفال:لذلك فإن التعبير
.//target
صالحة ؛//...
هو لا!هناك بديل التنفيذ: lxml والتي هي أكثر من الأغنياء.إنها طبقات الوثائق المستخدمة ، في بناء التعليمات البرمجية.التي لا تتناسب مع العمل.
على
@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")
يجد واحد فقط-العنصر ؛ ...