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的DOM解析常用语法

加载头文件解析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)可以得到子节点的个数,从上可以看到子节点中有文本节点也有元素节点,可以根据子节点的字节类型找到想要的元素节点。

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

XML的DOM解析常用语法

 

使用.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


下一篇:C#中对xml数据的读取和写入