2012-10-21 50 views
0

我試圖在使用lxml的Python中驗證XML文檔。在python中使用lxml對DTD進行驗證受xmlns影響

DTD驗證會將xmlns命名空間的存在視爲錯誤。

此示例腳本

from lxml import etree 
from StringIO import StringIO 

dtd = etree.DTD(StringIO("<!ELEMENT a EMPTY>")) 
root = etree.XML("<a></a>") 
print(dtd.validate(root)) 
root = etree.XML('<a xmlns:sru="http://www.loc.gov/zing/srw/"></a>') 
print(dtd.validate(root)) 
print dtd.error_log 

產生

True 
False 
<string>:1:0:ERROR:VALID:DTD_UNKNOWN_ATTRIBUTE: No declaration for attribute xmlns:sru of element a 

我怎麼能有LXML驗證我的文檔針對DTD沒有抱怨XML命名空間?

回答

2

您必須爲DTD中的a元素定義xmlns:sru屬性。它目前沒有。

<!ELEMENT a EMPTY> 
<!ATTLIST a xmlns:sru CDATA #IMPLIED> 

這爲元素a上的xmlns:sru定義了一個可選的CDATA屬性。

+0

聽起來很公平。我認爲'xmlns:foo'屬性總是被允許「自動」,但我現在明白它在http://www.w3.org/TR/xhtml1/dtds.html中明確提到。謝謝。 – silviot

+1

沒問題,一直想試一試lxml。祝你好運 – johnrom