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 "'\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()