我试图让读者从破碎的XML中恢复.将libxml2.XML_PARSE_RECOVER选项与DOM api(libxml2.readDoc)配合使用可以从实体问题中恢复.
但是,使用带有阅读器API的选项(由于我们正在解析的文档的大小,这是必不可少的)不起作用.它只是陷入永久循环(使用reader.Read()返回-1):
示例代码(小例子):
import cStringIO
import libxml2
DOC = "<a>some broken & xml</a>"
reader = libxml2.readerForDoc(DOC, "urn:bogus", None, libxml2.XML_PARSE_RECOVER | libxml2.XML_PARSE_NOERROR)
ret = reader.Read()
while ret:
print 'ret: %d' % ret
print "node name: ", reader.Name(), reader.NodeType()
ret = reader.Read()
Run Code Online (Sandbox Code Playgroud)
任何想法如何正确恢复?
我不太确定 libxml2 绑定的当前状态。甚至 libxml2 站点也建议使用lxml。解析这棵树并忽略&lxml 中的 是很好和干净的:
from cStringIO import StringIO
from lxml import etree
DOC = "<a>some broken & xml</a>"
reader = etree.XMLParser(recover=True)
tree = etree.parse(StringIO(DOC), reader)
print etree.tostring(tree.getroot())
Run Code Online (Sandbox Code Playgroud)
lxml 文档中的解析器页面更详细地介绍了有关设置解析器和迭代内容的信息。
编辑:
如果您想增量地解析文档,也可以使用 XMLparser 类,因为它是以下类的子类_FeedParser:
DOC = "<a>some broken & xml</a>"
reader = etree.XMLParser(recover=True)
for data in StringIO(DOC).read():
reader.feed(data)
tree = reader.close()
print etree.tostring(tree)
Run Code Online (Sandbox Code Playgroud)