在一些代码中,我维护使用 minidom 库进行 XML 解析。
对于类似于以下的 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")
是的,这绝对比原版更干净,但我正在寻找一个图书馆,它将向我提供这些信息。