2013-02-06 10 views
5

Ho uno script che analizza XML utilizzando lxml.etree:Come risolvere soggetti esterni con xml.etree come lxml.etree

from lxml import etree 

parser = etree.XMLParser(load_dtd=True, resolve_entities=True) 
tree = etree.parse('main.xml', parser=parser) 

Ho bisogno load_dtd=True e resolve_entities=True essere hanno &emptyEntry; da globals.xml risolto:

<?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> 

con globals.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!ENTITY emptyEntry "<entry></entry>"> 

Ora mi piacerebbe passare dallo standard lxml allo standard xml.etree. Ma questo non funziona con il mio file perché il load_dtd=True e resolve_entities=True non è supportato da xml.etree.

C'è una via xml.etree per risolvere queste entità?

risposta

1

Il mio trucco è quello di utilizzare il programma xmllint esterna

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