5

以下を使用して XML を解析するスクリプトがありますlxml.etree

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=Trueresolve_entities=Trueますxml.etree

xml.etreeこれらのエンティティを解決する方法はありますか?

4

2 に答える 2

1

私のトリックは、外部プログラム xmllint を使用することです

proc = subprocess.Popen(['xmllint','--noent',fname],stdout=subprocess.PIPE)
output = proc.communicate()[0]
tree = ElementTree.parse(StringIO.StringIO(output))
于 2013-10-16T09:59:58.147 に答える
0

lxml は、この仕事に適したツールです。

ただし、stdlib を使用する場合は、困難に備えて、XMLParser の UseForeignDTD メソッドを調べてください。これは良い (しかしハックな) 例です: Python ElementTree support for parsing unknown XML entities?

于 2013-02-20T14:39:23.893 に答える