【Python】基于 DOM 的 XML 文档解析(xml.dom.minidom)


简介

xml.dom.minidom 是 DOM 接口的最小化实现,具有和其它语言类似的 API。它的目标是比完整的 DOM 简单,并且更为小巧。对于 DOM 不熟悉的用户用户应当考虑用 xml.etree.ElementTree 模块来进行 XML 文件的处理。

开始

DOM 应用程序通常会从将某个 XML 解析为 DOM 开始。使用 xml.dom.minidom 时,这是通过各种解析函数来完成的:

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 a string

parse() 函数可以接受一个文件名或打开的文件对象。如果你将 XML 存为字符串,则可以改用 parseString() 函数。两个函数均返回一个代表文档内容的 Document 对象。

新建

你也可以通过在一个 DOM Implementation 对象上调用方法来创造 Document。此对象可通过调用 xml.dom 包或 xml.dom.minidom 模块中的 getDOMImplementation() 函数来获取。一旦你获得了一个 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 文档对象,你就可以通过其的属性和方法访问 XML 文档的各个部分。这些属性定义在 DOM 规格说明当中。文档对象的主要特征属性是 documentElement 属性。它给出了 XML 文档中的主元素:即包含了所有其它元素的元素。以下是一个程序示例:

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

结束

当你完成一个 DOM 树的处理时,你可以选择调用 unlink() 方法以鼓励尽早清除不再需要的对象。unlink() 是 xml.dom.minidom 针对 DOM API 的专属拓展,它会将特定节点和它的下级节点标记为不再有用。此外,Python 的垃圾回收器将负责处理树结构中的对象。

示例

程序代码:

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)

执行结果:

<html>
<title>Demo slideshow</title>
<p>Slide title</p>
<p>Another demo slide</p>
<h2>Slide title</h2>
<ul>
<li>This is a demo</li>
<li>Of a program for processing slides</li>
</ul>
<h2>Another demo slide</h2>
<ul>
<li>It is important</li>
<li>To have more than</li>
<li>one slide</li>
</ul>
</html>

参考

https://docs.python.org/3/library/xml.dom.minidom.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值