XML的DOM解析常用语法

Posted 悠然扎记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML的DOM解析常用语法相关的知识,希望对你有一定的参考价值。

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

什么是XML?

什么是DOM?

XML DOM

元素的属性和访问方法

文件保存


什么是XML

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

 

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

 

什么是DOM

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

 

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


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


XML DOM

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

节点:根据DOMXML中每个成分都是一个节点。将整个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 "'\n\t'"><DOM Element: folder at 0x7fd121412178>, <DOM Text node "'\n\t'">, <DOM Element: filename at 0x7fd121412508>, <DOM Text node "'\n\t'">, <DOM Element: path at 0x7fd1214125a0>,  <DOM Text node "'\n\t'">, <DOM Element: source at 0x7fd121412638>,   <DOM Text node "'\n\t'"><DOM Element: size at 0x7fd121412768><DOM Text node "'\n\t'"><DOM Element: segmented at 0x7fd1214129c8><DOM Text node "'\n\t'">, ......]

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

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


使用.data获得文本节点的值>>> nodelist[0].childNodes[0] #得到文本节点<DOM Text node "'\n\t'">>>> nodelist[0].childNodes[0].data'\n\t'>>> 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 = '\t',newl = '\n', addindent = '\t',encoding='utf-8')f.close()


以上是关于XML的DOM解析常用语法的主要内容,如果未能解决你的问题,请参考以下文章

DOM解析xml文件

Android之DOM解析XML

Android之DOM解析XML

java代码用dom4j解析xml文件的简单操作

JAVA之DOM和SAX解析器

Java解析XML三种常用方法