2010-01-27 87 views
3

我需要按如下方式解析XML文件的一個版本。用Python讀取XML DOCTYPE信息

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE twReport [ 
<!ELEMENT twReport (twHead?, (twWarn | twDebug | twInfo)*, twBody, twSum?, 
       twDebug*, twFoot?, twClientInfo?)> 
<!ATTLIST twReport version CDATA "10,4"> <----- VERSION INFO HERE 

我使用xml.dom.minidom解析XML文件,我需要解析寫在嵌入式DTD的XML文件的版本。

  • 我可以爲此使用xml.dom.minidom嗎?
  • 有沒有用於此目的的任何Python XML解析器?
+0

「易」是什麼意思?在Python中使用各種xml解析器似乎很容易。你還能想要什麼? – 2010-01-27 14:24:03

+0

我想得到更簡單的解決方案 - 就像使用xml.dom.minidom或類似的東西,不使用Python的SAX或其他第三方庫。 – prosseek 2010-01-27 16:08:48

+0

問題說「我想用... xml.dom.minidom」。您評論說「使用xml.dom.minidom」。顯然,你認爲這很容易。問題是什麼? – 2010-01-27 16:21:29

回答

2

xmlprocDTD api

這裏是代碼的隨機片段我寫了多年以前做從Python的DTD的一些工作,這可能給你的是什麼樣子與此庫的工作的想法:

from xml.parsers.xmlproc import dtdparser 

attr_separator = '_' 
child_separator = '_' 

dtd = dtdparser.load_dtd('schedule.dtd') 

for name, element in dtd.elems.items(): 
    for attr in element.attrlist: 
     output = '%s%s%s = ' % (name, attr_separator, attr) 
     print output 
    for child in element.get_valid_elements(element.get_start_state()): 
     output = '%s%s%s = ' % (name, child_separator, child) 
     print output 

(FYI ,這是第一次結果時searching for "python dtd parser"

+0

看起來不錯,但是具有版本號的DTD信息是XML文件的一部分。 – prosseek 2010-01-27 16:06:03

+0

你真的需要這個文件有什麼信息?它只是嵌入式DTD的版本信息嗎?如果是這樣,爲什麼不用一個正則表達式呢? – 2010-01-27 16:42:59

+0

我想我應該指出'xmlproc'解析器提供了一個'get_dtd'方法,可以讓你訪問解析XML文件的DTD。這可能是也可能不是你要找的。這一切都在我鏈接到的文檔中解釋。 – 2010-01-27 17:15:14

0

因爲無論是標準庫XML庫(xml.dom.minidomxml.etree)使用相同的解析器(xml.parsers.expat)你是在XML數據的「質量」的限制,你就能夠成功地解析。

你最好使用那些已經驗證過的第三方模塊,比如lxmlBeautifulSoup,它們不僅更容易發生錯誤,而且還會給你準確無誤的東西。