в некотором коде, который я поддерживаю, разбор XML, используя библиотеку minidom.Python XML XPath частичное сообщение об ошибке
Для структуры XML, аналогично описанному ниже:
<a val="a1">
<b val="b1">
<c val="c1">
Data
</c>
</b>
</a>
код выглядит следующим образом:
for a in doc.getElementsByTagName("a"):
aId = a.getAttribute("val").encode('ascii')
if aId == aExpected:
aFound = a
break
else: # not found
raise Exception("No A '%s' found" % aExpected)
for b in aFound.getElementsByTagName("b"):
bId = b.getAttribute("val").encode('ascii')
if bId == bExpected:
bFound = b
break
else: # not found
raise Exception("No B '%s' found" % bExpected)
# similar for c
Я хотел использовать XPath для поиска данных. я могу сделать это с (ElementTree):
root.findall(".//a[@val=%s]/b[@val=%s]/c[@val=%s]" % (aExpected, bExpected, cExpected))
код выглядит намного лучше прямо сейчас. Но когда данные не найдены в XML, findall() возвращает None, и мне приходится вручную анализировать файл для первого несогласованного элемента.
Есть ли возможность в ElementTree (или другом XML API) использовать XPath и вернуть XPath первую точку сбойного сбоя (аналогично предложениям else в исходном коде)?
Как указано в одном ответе, код может быть замещен:
aFound = root.find(".//a[@val=%r]" % (aExpected,))
if not aFound:
raise("A not present")
bFound = aFound.find("b[@val=%r]" % (bExpected,))
if not bFound:
raise("B not present")
cFound = bFound.find("c[@val=%r]" % (cExpected,))
if not cFound:
raise("C not present")
Да, это, безусловно, чище, чем оригинал, но я искал библиотеку, которое дало бы эту информацию мне.