我试图使用 lxml 的解析器目标接口将 XML 增量解析为“自定义”树,我遇到了以下问题:如果您实例化解析器并立即为其提供根元素的开始标记,“开始”在发生任何其他事件(例如传入数据、结束标签、另一个开始标签等)之前,目标的回调不会触发。这似乎不会发生在任何其他(嵌套)元素上。
示范:
class EchoTarget(object):
def start(self, tag, attrib):
print("start %s %s" % (tag, attrib))
def end(self, tag):
print("end %s" % tag)
def data(self, data):
print("data %r" % data)
def comment(self, text):
print("comment %s" % text)
def close(self):
print("close")
return "closed!"
>>> p = etree.XMLParser(target=EchoTarget())
>>> p.feed('<a>') # nothing happens
>>> p.feed(' ') # suddenly..
start a {}
>>> p.feed('<b>') # works as expected
data u' '
start b {}
有一种方法可以解决这个问题:
>>> p = etree.XMLParser(target=EchoTarget())
>>> p.feed(' ')
>>> p.feed('<a>')
start a {}
对此有何解释?解决方法是否“有效”?也就是说,依靠这种行为来确保流中的第一个开始标记将触发“开始”回调是否安全?
顺便说一句,还有另一种方法可以实现此结果:
>>> p = etree.XMLParser(target=EchoTarget())
>>> p.feed('<a')
>>> p.feed('>')
start a {}
但是,将流分成 2 个字符长度的块似乎有点过头了。