19.9. xml.dom.minidom —最小的 DOM 实现

2.0 版中的新Function。

源代码: Lib/xml/dom/minidom.py


xml.dom.minidom是文档对象模型接口的最小实现,其 API 与其他语言相似。它旨在比完整的 DOM 更简单,并且也明显更小。尚不熟悉 DOM 的用户应考虑改用xml.etree.ElementTree模块进行 XML 处理。

Warning

xml.dom.minidom模块不能安全防范恶意构建的数据。如果您需要解析不可信或未经身份验证的数据,请参见XML vulnerabilities

DOM 应用程序通常从将某些 XML 解析为 DOM 开始。对于xml.dom.minidom,这是pass解析函数完成的:

from xml.dom.minidom import parse, parseString

dom1 = parse('c:\\temp\\mydata.xml')  # parse an XML file by name

datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource)  # parse an open file

dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')

parse()函数可以使用文件名或打开的文件对象。

如果字符串中包含 XML,则可以改用parseString()函数:

这两个函数都返回一个Document对象,该对象代表文档的内容。

parse()parseString()函数的作用是将 XML 解析器与“ DOM 构建器”连接,该生成器可以接受来自任何 SAX 解析器的解析事件并将其转换为 DOM 树。函数的名称可能会引起误解,但在学习接口时很容易掌握。这些函数返回之前,将完成文档的解析。只是这些函数本身不提供解析器实现。

您也可以pass在“ DOM 实施”对象上调用方法来创建Document。您可以pass调用xml.dom包中的getDOMImplementation()函数或xml.dom.minidom模块来获取此对象。使用xml.dom.minidom模块中的实现将始终从 minidom 实现中返回Document实例,而xml.dom中的版本可以提供替代实现(如果已安装PyXML package,则可能会出现这种情况)。一旦有了Document,就可以向其添加子节点以填充 DOM:

from xml.dom.minidom import getDOMImplementation

impl = getDOMImplementation()

newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)

一旦有了 DOM 文档对象,就可以pass其属性和方法访问 XML 文档的各个部分。这些属性在 DOM 规范中定义。文档对象的主要属性是documentElement属性。它为您提供 XML 文档中的主要元素:包含所有其他元素的元素。这是一个示例程序:

dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"

完成 DOM 树后,可以选择调用unlink()方法以鼓励及早清除现在不需要的对象。 unlink()是 DOM API 的xml.dom.minidom特定扩展,它使节点及其后代基本上没有用。否则,Python 的垃圾收集器将finally处理树中的对象。

See also

19.9.1. DOM 对象

xml.dom模块文档中提供了 Python 的 DOM API 的定义。本节列出了 API 和xml.dom.minidom之间的区别。

对于Document节点,可以使用其他关键字参数* encoding *来指定 XMLHeaders 的编码字段。

在版本 2.1 中进行了更改:添加了可选关键字参数* indent addindent newl *以支持漂亮的输出。

在版本 2.3 中更改:对于Document节点,可以使用其他关键字参数* encoding *来指定 XMLHeaders 的编码字段。

如果不带参数,则 XMLHeaders 不指定编码,如果默认编码不能表示文档中的所有字符,则结果为 Unicode 字符串。由于 UTF-8 是 XML 的默认编码,因此使用 UTF-8 以外的其他编码对该字符串进行编码可能不正确。

使用显式的* encoding * [1]参数,结果是指定编码中的字节字符串。建议始终指定此参数。为避免出现文本数据无法表示的UnicodeError异常,应将编码参数指定为“ utf-8”。

在版本 2.3 中进行了更改:引入了* encoding *参数;参见writexml()

2.1 版中的新Function。

在版本 2.3 中进行了更改:引入了 encoding 参数;参见writexml()

以下标准 DOM 方法对xml.dom.minidom有特殊考虑:

19.9.2. DOM 示例

该示例程序是一个简单程序的相当实际的示例。在这种特殊情况下,我们没有充分利用 DOM 的灵 Active。

import xml.dom.minidom

document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>

<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""

dom = xml.dom.minidom.parseString(document)

def getText(nodelist):
    rc = []
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

def handleSlideshow(slideshow):
    print "<html>"
    handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
    slides = slideshow.getElementsByTagName("slide")
    handleToc(slides)
    handleSlides(slides)
    print "</html>"

def handleSlides(slides):
    for slide in slides:
        handleSlide(slide)

def handleSlide(slide):
    handleSlideTitle(slide.getElementsByTagName("title")[0])
    handlePoints(slide.getElementsByTagName("point"))

def handleSlideshowTitle(title):
    print "<title>%s</title>" % getText(title.childNodes)

def handleSlideTitle(title):
    print "<h2>%s</h2>" % getText(title.childNodes)

def handlePoints(points):
    print "<ul>"
    for point in points:
        handlePoint(point)
    print "</ul>"

def handlePoint(point):
    print "<li>%s</li>" % getText(point.childNodes)

def handleToc(slides):
    for slide in slides:
        title = slide.getElementsByTagName("title")[0]
        print "<p>%s</p>" % getText(title.childNodes)

handleSlideshow(dom)

19.9.3. 极简主义和 DOM 标准

xml.dom.minidom模块实质上是具有 DOM 2 Function(主要是名称空间Function)的 DOM 1.0 兼容 DOM。

Python 中 DOM 接口的用法很简单。以下 Map 规则适用:

以下接口在xml.dom.minidom中没有实现:

这些大多数反映在 XML 文档中的信息对于大多数 DOM 用户而言并不是通用的。

Footnotes

首页