2012-05-01 81 views
4

我有一堆XML文件使用前綴,但沒有相應的名稱空間聲明。如何使用lxml解析包含前綴但不包含名稱空間聲明的XML?

東西一樣:

<tal:block tal:condition="foo"> 
... 
</tal:block> 

或:

<div i18n:domain="my-app"> 
... 

我知道那些前綴來自中,我嘗試以下,但沒有成功:

from lxml import etree as ElementTree 

ElementTree.register_namespace("i18n", "http://namespaces.zope.org") 
ElementTree.register_namespace("tal", "http://xml.zope.org/namespaces/tal") 

with open(path) as fp: 
    tree = ElementTree.parse(fp) 

但LXML仍嗆着:

lxml.etree.XMLSyntaxError: Namespace prefix i18n for domain on div is not defined, line 4, column 20 

我知道我可以使用ElementTree.XMLParser(recover=True),但是我想保留前綴,而這個方法不會。

有什麼想法?

回答

1

這不是有效的XML,使用未定義的前綴,因此沒有XML解析器能夠處理它。

您最好的選擇(除了修復XML)是通過編程修改XML源以將名稱空間屬性添加到根元素(僅使用您的語言中的字符串支持)。在將XML提供給解析器之前,將xmlns:tal="http://xml.zope.org/namespaces/tal"等添加到根元素。然後,XML解析器應該無需投訴並且沒有任何註冊名稱空間的情況下處理它。

相關問題