您当前的位置: 首页 >  Python

Xavier Jiezou

暂无认证

  • 3浏览

    0关注

    394博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

Xavier Jiezou 发布时间:2021-08-10 09:44:51 ,浏览量:3

文章目录
  • 简介
  • 开始
  • 新建
  • 调用
  • 结束
  • 示例
  • 参考

简介

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('Some data some more data') # 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("Some data")
assert dom3.documentElement.tagName == "myxml"
结束

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

示例

程序代码:

import xml.dom.minidom

document = """\

Demo slideshow
Slide title
This is a demo
Of a program for processing slides


Another demo slide
It is important
To have more than
one slide


"""

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("")
    handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
    slides = slideshow.getElementsByTagName("slide")
    handleToc(slides)
    handleSlides(slides)
    print("")

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("%s" % getText(title.childNodes))

def handleSlideTitle(title):
    print("%s" % getText(title.childNodes))

def handlePoints(points):
    print("
    ") for point in points: handlePoint(point) print("
") def handlePoint(point): print("
  • %s
  • " % getText(point.childNodes)) def handleToc(slides): for slide in slides: title = slide.getElementsByTagName("title")[0] print("

    %s

    " % getText(title.childNodes)) handleSlideshow(dom)

    执行结果:

    
    Demo slideshow
    Slide title
    Another demo slide
    Slide title
    
    This is a demo
    Of a program for processing slides
    
    Another demo slide
    
    It is important
    To have more than
    one slide
    
    
    
    参考

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

    关注
    打赏
    1661408149
    查看更多评论
    立即登录/注册

    微信扫码登录

    0.0815s