【问题标题】:Reading XML DOCTYPE info with Python使用 Python 读取 XML DOCTYPE 信息
【发布时间】:2010-01-28 22:10:46
【问题描述】:

我需要解析一个 XML 文件的版本,如下所示。

<?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 解析器?

【问题讨论】:

  • “简单”是什么意思?在 Python 中使用各种 xml 解析器似乎很容易。你还想要什么?
  • 我想获得更简单的解决方案——比如使用 xml.dom.minidom 或类似的东西,而不是使用 Python 的 SAX 或其他 3rd 方库。
  • 问题是“我想使用 ... xml.dom.minidom”。您的评论说“使用 xml.dom.minidom”。显然,您认为这更容易。有什么问题?
  • 我使用xml.dom.minidom解析XML文件,需要解析嵌入DTD编写的XML文件的版本。所以,我想知道的是 * 我可以为此目的使用 xml.dom.minidom 吗? * 是否有任何用于此目的的 python XML 解析器?我猜第一个问题的答案是“否”,我也看到第二个问题的答案是“是”。但最好的解决方案可能只是使用正则表达式读取和解析 XML。感谢您的回答。
  • 请更新您的问题以澄清它。将 cmets 添加到您拥有的问题中会使其他人难以理解。请澄清您的问题。

标签: python xml


【解决方案1】:

xmlprocDTD api 怎么样?

这是我多年前编写的随机 sn-p 代码,用于处理 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

(仅供参考,这是searching for "python dtd parser"时的第一个结果)

【讨论】:

  • 看起来还不错,但是带有版本号的DTD信息是XML文件的一部分。
  • 您实际上需要从该文件中获得哪些信息?它只是来自嵌入式 DTD 的版本信息吗?如果是这样,你为什么不直接用正则表达式把它拉出来?
  • 我想我应该指出xmlproc 解析器提供了一个get_dtd 方法,可以让您访问已解析的XML 文件的DTD。这可能是也可能不是您正在寻找的东西。这在我链接到的文档中都有解释。
  • > 你为什么不用正则表达式把它拉出来呢?这实际上是我为完成工作所做的,但我想知道是否有一些功能可以做到这一点。谢谢,这是一个很大的帮助。
【解决方案2】:

因为标准库 XML 库(xml.dom.minidomxml.etree)都使用相同的解析器(xml.parsers.expat),所以您能够成功解析的 XML 数据的“质量”受到限制。

您最好使用久经考验的第 3 方模块,例如 lxmlBeautifulSoup,它们不仅对错误更具弹性,而且还可以用很少的时间为您提供所需的内容麻烦。

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多