• XML的DOM解析常用语法


    XML文件常用来存储使用的数据,对数据的处理就需要掌握XML文件解析的语法,为清楚了解xml及常用的解析方法dom,本文包含以下内容:

    什么是XML?

    什么是DOM?

    XML DOM

    元素的属性和访问方法

    文件保存

    什么是XML?

    XML(eXtensible Markup Language)是一种可扩展标记语言,使用了一种结构化文档和数据的通用且适应性强的格式,被设计用来传输和存储数据,它不仅仅可以用于 WEB,而且可以被用于任何地方。于 1998 年 2 月被引入软件工业。

    标记语言,之前提到过的HTML也是(超链接纯文本)标记语言,但HTML主要用来显示数据。

    什么是DOM?

    DOM(Document Object Model)文档对象模型,是 W3C(World Wide Web Consortium,万维网联盟) 的推荐标准,W3C 文档对象模型(DOM)是一个使程序和脚本有能力动态地访问和更新文档的内容、结构以及样式的平台和语言中立的接口,定义了访问诸如 XML 和 HTML 文档的标准。

    DOM不是XML独用的接口或者方法,而是一种标准接口,在Python语言中实际使用时XML也不是只有DOM方法可以解析,Python官方文档中可以查到xml.dom说明文档。

    W3school 上有XML和DOM的完整教程资源,菜鸟教程上也有,内容分布大致一样。

    XML DOM

    XML DOM 是用于 XML 文档的标准模型,定义了所有 XML 元素的对象和属性,以及访问它们的方法(接口)。

    节点:根据DOM,XML中每个成分都是一个节点。将整个xml文档看做是一个节点树,解析的时候,文档节点是根节点,根据(节点)树原则,节点之间是相互联系的,有父节点和子节点,这种联系为遍历节点树提供了基础。

    根据实际使用,每个xml元素是元素节点,看着包含在元素节点中的文本实际是文本节点,每个xml属性是属性节点。

    元素:是指xml中从开始标签到结束标签组成的部分,如<xx>就是一个标签。元素包含的可以有标签、属性节点、文本节点、其他元素等。

    文本:文本总是存储在文本节点中,元素(节点)包含文本节点,元素的文本存储在文本节点中。

    属性:属性(Attribute)提供有关元素的额外信息。属性是有值的。

    元素的属性和访问方法

    虽然xml主要用于web中,但是我使用的时候xml是存储图像样本标注数据用的,使用Python语言读取内容,以下会使用Python来说明节点树中遍历与查找方法:

    已有XML文件如下图:

    加载头文件解析xml文件:
    from xml.dom.minidom import parse

    解析xml文件
    >>xmlpathIn = 'Annotations/PartB_01489.xml'
    >>root = parse(xmlpathIn) #得到文档的根节点
    >>> root
    <xml.dom.minidom.Document object at 0x7fd121452108>

    getElementsByTagName() 返回拥有指定标签名的所有元素。

    >>> nodelist = root.getElementsByTagName('annotation') #得到nodelist
    >>> nodelist
    [<DOM Element: annotation at 0x7fd11fed4df0>]

    得到元素节点的节点(标签)名字

    >>> nodelist[0] #得到元素节点,DOM Element提示<DOM Element: annotation at 0x7fd11fed4df0
    >
    >>> nodelist[0].nodeName
    'annotation'

    得到元素节点的子节点

    >>> nodelist[0].childNodes
    [<DOM Text node "' '">, <DOM Element: folder at 0x7fd121412178>, <DOM Text node "' '">,
    <DOM Element: filename at 0x7fd121412508>,
    <DOM Text node "' '">, <DOM Element: path at 0x7fd1214125a0>,
    <DOM Text node "' '">, <DOM Element: source at 0x7fd121412638>,
      <DOM Text node "' '">, <DOM Element: size at 0x7fd121412768>, 
    <DOM Text node "' '">, <DOM Element: segmented at 0x7fd1214129c8>, <DOM Text node "' '">, ......]

    使用len(nodelist[0].childNodes)可以得到子节点的个数,从上可以看到子节点中有文本节点也有元素节点,可以根据子节点的字节类型找到想要的元素节点。

    菜鸟上的节点类型与命名常量的对应表如图所示,可供查阅。

    使用.data获得文本节点的值
    >>> nodelist[0].childNodes[0] #得到文本节点
    <DOM Text node "' '">
    >>> nodelist[0].childNodes[0].data
    ' '
    >>> nodelist[0].childNodes[0].nodeType #文本节点的类型是3,与上表对应
    3

    xml元素’ <folder>img</folder> ‘中节点看着是并列的,但是文本节点"'img'"却是元素节点 Element: folder的子节点

    >>> nodelist[0].childNodes[1].childNodes
    [<DOM Text node "'img'">]
    >>> nodelist[0].childNodes[1].childNodes[0].data
    'img'

    可以在节点处利用childNodes、parentNode访问子节点和父节点

    >>> nodelist[0].childNodes[1]
    <DOM Element: folder at 0x7fd1214833d8>
    >>> nodelist[0].childNodes[1].parentNode
    <DOM Element: annotation at 0x7fd11fed4df0>

    xml文档具有可自主拓展性,以上说明了怎么在树节点中进行父子节点访问和获得节点的值,现在来举例说明怎么进行节点修改。

    创建元素节点:
    >>> ntest = root.createElement('new')
    >>> ntest
    <DOM Element: new at 0x7fd1214880e0>

    新增节点:

    >>> nodelist[0].childNodes[1]
    <DOM Element: folder at 0x7fd1214833d8>
    >>> y =nodelist[0].childNodes[3]
    >>> y
    <DOM Element: filename at 0x7fd121483470
    >
    >>> nodelist[0].childNodes[1].appendChild(y)
    <DOM Element: filename at 0x7fd121483470>
    >>> nodelist[0].childNodes[1].childNodes
    [<DOM Text node "'img'">, <DOM Element: filename at 0x7fd121483470>]

    删除节点:

    >> nodelist[0].childNodes[1].removeChild(y)
    <DOM Element: filename at 0x7fd121483470>
    >>> nodelist[0].childNodes[1].childNodes
    [<DOM Text node "'img'">]


    文件保存

    保存修改的节点树到文件
    f = open('xxx.xml','w')
    root.writexml(f,indent = ' ',newl = ' ', addindent = ' ',encoding='utf-8')
    f.close()

     

  • 相关阅读:
    简单工厂设计模式-模拟磁盘打开文件
    使用GDI绘制验证码
    nginx笔记.
    git 笔记
    ubuntu错误解决。
    测试那些事儿—简述CPU的工作原理
    田螺便利店—win10专业版激活码
    田螺便利店—PyCharm安装第三方库
    田螺便利店—命令提示符总是提示不是内部外部命令
    田螺便利店—ipconfig命令不是内部命令或外部命令怎么解决?
  • 原文地址:https://www.cnblogs.com/xiaoheizi-12345/p/14351590.html
Copyright © 2020-2023  润新知