2012-10-04 31 views
3

我有下面的XML文件,目前我正在使用minidom,我得到documentElementtagNamexyz:widget这个例子,它告诉我它忽略了!ENTITY definitions,因此!DOCTYPE参考。Python:哪个XML解析器支持DTD!ENTITY定义?

哪个XML解析器支持Document Type Definitions使!ENTITY definitions和DOCTYPE参考不会被忽略:

<?xml version="1.0" standalone="yes" ?> 
<!DOCTYPE widget [ 
<!ENTITY widgets-ns "http://www.w3.org/ns/widgets"> 
<!ENTITY pass "pass&amp;.html"> 
]> 
<xyz:widget xmlns:xyz="&widgets-ns;"> 
    <xyz:content src="&pass;"/> 
    <xyz:name>bv</xyz:name> 
</xyz:widget> 

因此,对于上面的例子中,你可以使用Python XML相当于:

<widget xmlns="http://www.w3.org/ns/widgets"> 
    <content src="pass&amp;.html"/> 
    <name>bv</name> 
</widget> 

或得到DOM,其具有documentElement作为widget及其childNodes作为contentnamewidget属性作为xmlns与值http://www.w3.org/ns/widgets

我可能可能不会使用正确的术语,但我希望我通过上述示例的帮助使自己清楚。

回答

6

LXML处理这个问题就好了:

>>> from lxml import etree 
>>> s = """<?xml version="1.0" standalone="yes" ?> 
... <!DOCTYPE widget [ 
... <!ENTITY widgets-ns "http://www.w3.org/ns/widgets"> 
... <!ENTITY pass "pass&amp;.html"> 
... ]> 
... <xyz:widget xmlns:xyz="&widgets-ns;"> 
... <xyz:content src="&pass;"/> 
... <xyz:name>bv</xyz:name> 
... </xyz:widget> 
... """ 
>>> etree.fromstring(s) 
<Element {http://www.w3.org/ns/widgets}widget at 7f4de2cc58e8> 
>>> etree.fromstring(s).xpath("//xyz:content/@src", 
...       namespaces={"xyz": "http://www.w3.org/ns/widgets"}) 
['pass&.html']