2008-11-18 105 views
3

我有以下Python代碼:Python的xml.dom.minidom.parse()函數忽略的DTD

import xml.dom.minidom 
import xml.parsers.expat 

try: 
    domTree = ml.dom.minidom.parse(myXMLFileName) 
except xml.parsers.expat.ExpatError, e: 
    return e.args[0] 

裏面我是用解析XML文件。雖然它很樂意景點,如不匹配的標籤簡單的XML錯誤,它完全忽略在XML文件的頂部指定的DTD:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<!DOCTYPE ServerConfig SYSTEM "ServerConfig.dtd"> 

因此當強制執行的內容缺失,例如,它沒有注意到。我如何開啓DTD檢查?

回答

4

this question - 接受的答案是使用lxml validation

+0

感謝。我希望避免必須在標準庫之外工作,但lxml肯定會做到這一點。也更容易閱讀。 – 2008-11-18 15:50:29

1

我推薦lxml over xmlproc,因爲PyXML包(包含xmlproc)不再被開發; PyXML可以使用的最新Python版本是2.4。

3

僅僅作爲解釋:Python xml.dom.minidom和xml.sax默認使用expat解析器,這是一個非驗證解析器。它可能會讀取DTD以進行實體替換,但不會對DTD進行驗證。

gimelTim推薦lxml,這對libxml2和libxslt庫來說是一個很好的pythonic綁定。它支持對DTD進行驗證。我一直在使用lxml,而且我非常喜歡它。

2

只是爲了記錄在案,這是我的代碼看起來像現在:

from lxml import etree 

try: 
    parser = etree.XMLParser(dtd_validation=True) 
    domTree = etree.parse(myXMLFileName, parser=parser) 
except etree.XMLSyntaxError, e: 
    return e.args[0]