2013-02-06 41 views
5

तरह xml.etree के साथ बाहरी संस्थाओं को हल करने मैं एक स्क्रिप्ट है कि XML पार्स lxml.etree का उपयोग कर दिया है:कैसे lxml.etree

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

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 से हल हो की जरूरत है

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

उत्तर

0

lxml नौकरी के लिए एक सही उपकरण है।

लेकिन, यदि आप stdlib का उपयोग करना चाहते हैं, तो कठिनाइयों के लिए तैयार रहें और XMLParser's UseForeignDTD विधि पर नज़र डालें। यहाँ एक अच्छा (लेकिन hacky) उदाहरण है: Python ElementTree support for parsing unknown XML entities?

1

मेरे चाल बाहरी कार्यक्रम xmllint

proc = subprocess.Popen(['xmllint','--noent',fname],stdout=subprocess.PIPE) 
output = proc.communicate()[0] 
tree = ElementTree.parse(StringIO.StringIO(output)) 
उपयोग करने के लिए है