Python:解析XML文档并保留实体

3 投票
4 回答
1753 浏览
提问于 2025-04-16 02:54

我想问一下,有哪些现成的Python 2.x库可以用来解析带有内置DTD的XML文档,而且是自动展开实体的。 (有兴趣的人可以查看这个文件: JMdict.)

看起来lxml有一些选项可以不解析实体,但我上次试的时候,实体最后变成了空白。我刚刚在网上查了一下,发现pxdom是另一个可以尝试的选择,不过因为它是纯Python写的,似乎运行起来比我希望的要慢很多。

还有其他的选择吗?

4 个回答

1

首先,BeautifulStoneSoup 是来自 BeautifulSoup 的一个工具,它默认情况下不会自动展开实体。

不过,这个工具可能不太适合你的需求,因为它主要是为了处理各种格式不正确和损坏的标记而设计的,所以在速度和效率上可能不太理想。

3

在这个问题中提到了lxml,根据我的理解,它可以满足你的需求。下面是测试代码:

from lxml import etree

XML = """
<!DOCTYPE root [
<!ENTITY abc "123">
]>
<root>
&abc;
</root>"""

parser = etree.XMLParser(resolve_entities=False)

root = etree.fromstring(XML, parser)
print "Entity not resolved:"
print etree.tostring(root)
print

print "Entity resolved:"
root = etree.fromstring(XML)
print etree.tostring(root)

输出结果:

Entity not resolved:
<root>
&abc;
</root>

Entity resolved:
<root>
123
</root>
1

看起来这个使用场景有点不寻常;不展开实体似乎和XML规范中解析器的正常工作方式相悖。

所以,我觉得最简单的办法就是将就一下。我通过re.finditer手动提取了标签,并做了一个映射的字典。从这里开始,只需要扫描解析后的输出,然后根据我的应用程序做出正确的处理。我觉得这样对我的使用场景来说已经足够了。

撰写回答