我发现自己正在执行以下操作,以查找可能出现在多个xpath上的一个节点,但是该节点本身只会出现一次:
node.xpath('//Parent')
这将搜索all路径以找到Parent
元素。但是,它只出现一次(尽管它可能出现在大约10条可能的路径上,并且写出来很繁琐)。有没有一种我可以使用的方法,当返回第一个元素而不是构建该路径上所有节点的列表时,可以更有效地查找并退出该方法?
如果我的理解正确,则不必使用XPath,并且可以通过其名称来标识有问题的元素。然后,您可以使用event-driven parsing-也称为“ SAX”解析-代替lxml默认情况下执行的常规“ DOM”解析。
代码类似于(伪代码)
some_file_like = BytesIO(b"<root><a>data</a></root>")
for event, element in etree.iterparse(some_file_like):
if element.tag == "Parent":
act_on(element)
break
或者,非常相似的方法是在Python中使用SAX解析器实现,例如https://docs.python.org/3/library/xml.sax.reader.html。这将为您提供对解析的更细粒度的控制,因为您将编写在遇到某种事件类型时执行的自定义回调。
一个例子,改编自here:
from xml.sax import saxutils, handler, make_parser
class ContentGenerator(handler.ContentHandler):
def __init__(self, out = sys.stdout):
handler.ContentHandler.__init__(self)
def startDocument(self):
pass
def startElement(self, name, attrs):
if name == "Parent":
# act on this element