在一些代碼中我維護那裏是使用minidom庫進行XML解析。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")
是的,這絕對比原來更乾淨,但我一直在尋找一個庫,這將使該信息給我。