实体引用与lxml

9 投票
1 回答
3749 浏览
提问于 2025-04-15 20:53

这是我写的代码:

from cStringIO import StringIO
from lxml import etree

xml = StringIO('''<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY test "This is a test">
]>
<root>
  <sub>&test;</sub>
</root>''')

d1 = etree.parse(xml)
print '%r' % d1.find('/sub').text

parser = etree.XMLParser(resolve_entities=False)
d2 = etree.parse(xml, parser=parser)
print '%r' % d2.find('/sub').text

这是运行后的结果:

'This is a test'
None

我该怎么做才能让lxml给我 '&test;',也就是原始的实体引用呢?

1 个回答

19

这个“未解决”的实体被留作元素节点 sub 的子节点。

>>> print d2.find('/sub')[0]
&test;
>>> d2.find('/sub').getchildren()
[&test;]

撰写回答