2011-03-31 74 views
2

我正在嘗試編寫一個驗證腳本,用於驗證NITF DTD中的XML,http://www.iptc.org/std/NITF/3.4/specification/dtd/nitf-3-4.dtd。基於this post我想出了以下簡單的腳本來驗證NITF XML文檔。 Bellow是腳本運行時得到的錯誤消息,這不是很具描述性,而且很難調試。任何幫助表示讚賞。使用lxml解析DTD時出錯

#!/usr/bin/env python 


def main(): 
    from lxml import etree, objectify 
    from StringIO import StringIO 

    f = open('nitf_test.xml') 
    xml_doc = f.read() 
    f.close() 

    f = open('nitf-3-4.dtd') 
    dtd_doc = f.read() 
    f.close() 

    dtd = etree.DTD(StringIO(dtd_doc)) 
    tree = objectify.parse(StringIO(xml_doc)) 
    dtd.validate(tree) 


if __name__ == '__main__': 

    main() 

回溯錯誤消息:

Traceback (most recent call last): 
    File "./test_nitf_doc.py", line 23, in <module> 
    main() 
    File "./test_nitf_doc.py", line 16, in main 
    dtd = etree.DTD(StringIO(dtd_doc)) 
    File "dtd.pxi", line 43, in lxml.etree.DTD.__init__ (src/lxml/lxml.etree.c:126056) 
    File "dtd.pxi", line 117, in lxml.etree._parseDtdFromFilelike (src/lxml/lxml.etree.c:126727) 
lxml.etree.DTDParseError: error parsing DTD 

如果我改變行:

dtd = etree.DTD(StringIO(dtd_doc)) 

要:

dtd = etree.DTD(dtd_doc) 

我得到的錯誤是:

lxml.etree.DTDParseError: failed to load external entity "NULL" 
+0

請發表您試圖將XML驗證。 – 2011-03-31 01:33:11

+0

這個'加載外部實體失敗'的錯誤信息是相當具有誤導性的。這實際上是因爲你將一個字符串傳遞給了DTD的構造函數而不是文件對象,但是這個錯誤信息根本無助於理解這一點。 – fviktor 2011-07-13 19:24:12

回答

5

我看了一下nitf-3-4.dtd,發現它引用了一個外部模塊xhtml-ruby-1.mod,它可以是downloaded at this link。這需要存在於當前目錄中,以便DTD解析器可以加載它。

全部工作示例(假設你有一個有效的NITF文件方便):

% wget http://www.iptc.org/std/NITF/3.4/specification/dtd/nitf-3-4.dtd 
% wget http://www.iptc.org/std/NITF/3.4/specification/dtd/xhtml-ruby-1.mod 

Python代碼:

from lxml import etree, objectify 
dtd = etree.DTD(open('nitf-3-4.dtd', 'rb')) 
tree = objectify.parse(open('nitf_test.xml', 'rb')) 
print dtd.validate(tree) 

輸出:

% python nitf_test.py 
True 
+0

謝謝,這工作! :) – Brent 2011-03-31 03:14:56

+0

很高興聽到它爲你工作! – samplebias 2011-03-31 03:28:22