我有一个使用lxml.etree解析XML的脚本。
from lxml import etree
parser = etree.XMLParser(load_dtd=True, resolve_entities=True)
tree = etree.parse('main.xml', parser=parser)我需要load_dtd=True和resolve_entities=True让来自globals.xml的&emptyEntry;解决:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE map SYSTEM "globals.xml" [
<!ENTITY dirData "${DATADIR}">
]>
<map
xmlns:map="http://my.dummy.org/map"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsschemaLocation="http://my.dummy.org/map main.xsd"
>
&emptyEntry; <!-- from globals.xml -->
<entry><key>KEY</key><value>VALUE</value></entry>
<entry><key>KEY</key><value>VALUE</value></entry>
</map>用globals.xml
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY emptyEntry "<entry></entry>">现在我想从非标准的lxml转到标准的xml.etree。但是这在我的文件中失败了,因为load_dtd=True和resolve_entities=True不受xml.etree的支持。
是否有一个xml.etree**-way来解析这些实体?**
发布于 2013-02-20 14:39:23
lxml是一个合适的工作工具。
但是,如果您想使用stdlib,那么就做好准备,看看XMLParser的UseForeignDTD方法。下面是一个很好(但很麻烦)的例子:Python ElementTree support for parsing unknown XML entities?
发布于 2013-10-16 09:59:58
我的诀窍是使用外部程序xmllint。
proc = subprocess.Popen(['xmllint','--noent',fname],stdout=subprocess.PIPE)
output = proc.communicate()[0]
tree = ElementTree.parse(StringIO.StringIO(output))https://stackoverflow.com/questions/14731633
复制相似问题