2013-02-06 7 views
5

Mam skrypt, który analizuje kod XML za pomocą lxml.etree:Jak rozwiązać podmioty zewnętrzne z xml.etree jak lxml.etree

from lxml import etree 

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

muszę load_dtd=True i resolve_entities=True być już &emptyEntry; z globals.xml rozwiązany:

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

z globals.xml

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

Teraz chciałbym przejść z niestandardowego lxml do standardowego xml.etree. Ale to nie powiedzie się z moim plikiem, ponieważ load_dtd=True i resolve_entities=True nie jest obsługiwany przez xml.etree.

Czy istnieje xml.etree -strona, aby te jednostki zostały rozwiązane?

Odpowiedz

1

Mój podstęp jest użycie zewnętrznego programu xmllint

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