2013-02-06 21 views
5

Tôi đã một kịch bản mà phân tích cú pháp XML sử dụng lxml.etree:Làm thế nào để giải quyết thực thể bên ngoài với xml.etree như lxml.etree

from lxml import etree 

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

Tôi cần load_dtd=Trueresolve_entities=True thể đã &emptyEntry; từ globals.xml giải quyết:

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

với globals.xml

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

Bây giờ tôi muốn chuyển từ phi tiêu chuẩn lxml thành tiêu chuẩn xml.etree. Nhưng điều này không thành công với tệp của tôi vì load_dtd=Trueresolve_entities=True không được hỗ trợ bởi xml.etree.

Có một số xml.etree để các thực thể này được giải quyết không?

Trả lời

1

lừa tôi là sử dụng các chương trình bên ngoài xmllint

proc = subprocess.Popen(['xmllint','--noent',fname],stdout=subprocess.PIPE) 
output = proc.communicate()[0] 
tree = ElementTree.parse(StringIO.StringIO(output)) 
Các vấn đề liên quan