2010-01-27 55 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,它们不仅更容易发生错误,而且还会给你准确无误的东西。