XML的定义
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
Python 提供了多种模块来处理XML。
- xml.dom.* 模块:Document Object Model。适合用于处理 DOM API。它能够将 xml 数据在内存中解析成一个树,然后通过对树的操作来操作 xml。但是,这种方式由于将 xml 数据映射到内存中的树,导致比较慢,且消耗更多内存。
- xml.sax.* 模块:simple API for XML。由于 SAX 以流式读取 xml 文件,从而速度较快,切少占用内存,但是操作上稍复杂,需要用户实现回调函数。
- xml.parser.expat:是一个直接的,低级一点的基于 C 的 expat 的语法分析器。 expat 接口基于事件反馈,有点像 SAX 但又不太像,因为它的接口并不是完全规范于 expat 库的。
- xml.etree.ElementTree (以下简称 ET):元素树。它提供了轻量级的 Python 式的 API,相对于 DOM,ET 快了很多 ,而且有很多令人愉悦的 API 可以使用;相对SAX,ET 也有 ET.iterparse 提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,节省内存。ET 的性能的平均值和 SAX 差不多,但是 API的效率更高一点而且使用起来很方便。
遍历查询
aaarticlea/png;base64,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" alt="" />
这是一个 xml 树,只不过是用图来表示的,还没有用 ET 解析呢。把这棵树写成 xml 文档格式:
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
建立起 xml 解析树。然后可以通过根节点向下开始读取各个元素(element 对象)。
>>> import xml.etree.cElementTree as ET
>>> tree = ET.ElementTree(file="22601.xml")
>>> tree
<ElementTree object at 0x7f8fbd411050>
>>> root = tree.getroot()
>>> root.tag
'bookstore'
>>> root.attrib
{}
读取根下面的元素:
>>> for child in root:
... print child.tag,child.attrib
...
book {'category': 'COOKING'}
book {'category': 'CHILDREN'}
book {'category': 'WEB'}
读取指定元素的信息:
>>> root[0].tag
'book'
>>> root[0].attrib
{'category': 'COOKING'}
>>> root[0].text #无内容
'\n\t\t'
再读取下一个元素
>>> root[0][0].tag
'title'
>>> root[0][0].attrib #第一元素
{'lang': 'en'}
>>> root[0][0].text
'Everyday Italian'
>>> root[0][1].tag #第二个元素
'author'
对于 ElementTree 对象,有一个 iter 方法可以对指定名称的子节点进行深度优先遍历。例如:
>>> for ele in tree.iter(tag="book"): #遍历book节点
... print ele.tag,ele.attrib
...
book {'category': 'COOKING'}
book {'category': 'CHILDREN'}
book {'category': 'WEB'}
>>> for ele in tree.iter(tag="title"): #遍历title节点
... print ele.tag,ele.attrib
...
title {'lang': 'en'}
title {'lang': 'en'}
title {'lang': 'en'}
除了上面的方法,还可以通过路径,搜索到指定的元素,读取其内容。这就是 xpath。
>>> for ele in tree.iterfind("book/title"):
... print ele.text
...
Everyday Italian
Harry Potter
Learning XML
利用 findall() 方法,也可以是实现查找功能:
>>> for ele in tree.findall("book"):
... title = ele.find('title').text
... price = ele.find('price').text
... print title,price
...
Everyday Italian 37.0
Learning XML 46.95
编辑
删除
除了读取有关数据之外,还能对 xml 进行编辑,即增删改查功能。还是以上面的 xml 文档为例:
>>> root[1][0].text
'Harry Potter'
>>> del root[1]
>>> root[1][0].text #可以看见Harry Potter已经被删除了
'Learning XML'
但是这样的操作源文件是没有改变的,现在只是在内存中做了修改而已,如果要修改源文件我们得这样做:
>>> import os
>>> outpath = os.getcwd()
>>> file = outpath + "/22601.xml"
>>> tree.write(file)
上面用del 来删除某个元素,其实,在编程中,这个用的不多,更喜欢用 remove() 方法。比如我要删除price> 40 的书。可以这么做:
>>> for book in root.findall("book"):
... price = book.find("price").text
... if float(price) > 40.0:
... root.remove(book)
...
>>> tree.write(file)
修改
>>> for price in root.iter("price"):
... new_price = float(price.text) + 7
... price.text = str(new_price)
... price.set("updated","up")
...
>>> tree.write(file)
>>> for price in root.iter("price"):
... print price.text
...
37.0
46.95
查看源文件
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price updated="up">37.0</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price updated="up">46.95</price>
</book>
</bookstore>
不仅价格修改了,而且在 price 标签里面增加了属性标记。
增加
>>> import xml.etree.cElementTree as ET
>>> tree = ET.ElementTree(file="22601.xml")
>>> root = tree.getroot()
>>> for ele in root:
... print ele.tag
...
book
book
>>> ET.SubElement(root, "book") #在 root 里面添加 book 节点
<Element 'book' at 0x7fc78fa06c90>
>>> for ele in root:
... print ele.tag
...
book
book
book
>>> b2 = root[2] #得到新增的 book 节点
>>> b2.text = "Python" #添加内容
>>> tree.write("22601.xml")
总结:
元素常用属性:
- tag:string,元素数据种类
- text:string,元素的内容
- attrib:dictionary,元素的属性字典
- tail:string,元素的尾形
针对属性的操作
- clear():清空元素的后代、属性、text 和 tail 也设置为 None
- get(key, default=None):获取 key 对应的属性值,如该属性不存在则返回 default 值
- items():根据属性字典返回一个列表,列表元素为(key, value)
- keys():返回包含所有元素属性键的列表
- set(key, value):设置新的属性键与值
针对后代的操作
- append(subelement):添加直系子元素
- extend(subelements):增加一串元素对象作为子元素
- find(match):寻找第一个匹配子元素,匹配对象可以为 tag 或 path
- findall(match):寻找所有匹配子元素,匹配对象可以为 tag 或 path
- findtext(match):寻找第一个匹配子元素,返回其 text 值。匹配对象可以为 tag 或 path
- insert(index, element):在指定位置插入子元素
- iter(tag=None):生成遍历当前元素所有后代或者给定 tag 的后代的迭代器
- iterfind(match):根据 tag 或 path 查找所有的后代
- itertext():遍历所有后代并返回 text 值
- remove(subelement):删除子元素
ElementTree 对象
- find(match)
- findall(match)
- findtext(match, default=None)
- getroot():获取根节点.
- iter(tag=None)
- iterfind(match)
- parse(source, parser=None):装载 xml 对象,source 可以为文件名或文件类型对象.
- write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None,method="xml")