如何使用xml.etree解析外部实体,如lxml.etree

时间:2013-02-06 14:37:42

标签: python xml lxml elementtree xml-entities

我有一个使用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 &emptyEntry;来自globals.xml已解决:

<?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=Truexml.etree

是否有xml.etree - 解决这些实体的方式?

2 个答案:

答案 0 :(得分:1)

我的诀窍是使用外部程序xmllint

proc = subprocess.Popen(['xmllint','--noent',fname],stdout=subprocess.PIPE)
output = proc.communicate()[0]
tree = ElementTree.parse(StringIO.StringIO(output))

答案 1 :(得分:0)

lxml是这项工作的正确工具。

但是,如果你想使用stdlib,那么请为困难做好准备并看看XMLParser的UseForeignDTD方法。这是一个很好的(但是hacky)示例:Python ElementTree support for parsing unknown XML entities?