python使用ElementTree解析xml

754 阅读3分钟

首先,什么是XML?

XML(EXtensible Makrup Language)可扩展标记语言。xml的标签没有被预定性,需要自行定义标签。

XML和HTML的差异

  • XML被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML被设计用来显示数据,其焦点是数据的外观。

HTML旨在显示信息,而XML旨在传输信息。

XML树结构

一个xml实例

<?xml version="1.0" encoding="UTF-8"?> # XML声明。它定义XML的版本和使用编码
<note> # 根元素
<to>Tove</to> # 子元素
<from>Jani</from> # 子元素
<heading>Reminder</heading> # 子元素
<body>Don't forget me this weekend!</body> # 子元素
</note> # 根元素的结尾

XML文档必须包含根元素。该元素是所有其他元素的父元素。所有元素都可以有子元素。所有元素都可以有文本内容和属性。

XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。一个元素可以包含:其他元素、文本、属性或混合以上所有...

XML属性提供有关元素的额外信息。但如果信息感觉起来很像数据,那么请使用元素吧。

<img src="computer.gif">
<a href="demo.html">
XML语法
  1. XML声明如存在需要放在文档的第一行。
  2. 所有的XML元素都必须都一个关闭标签。
  3. XML标签对大小写敏感。
  4. XML必须正确嵌套。
  5. XML属性值必须加引号。
  6. XML中的注释:
<!-- This is a comment -->

python使用ElementTree解析xml

解析

调用parse()方法,返回解析树

# python3.3之后ElementTree模块会自动寻找可用的C库来加快速度
try:
	import xml.etree.cElementTree as ET
except ImportError:
	import xml.etree.ElementTree as ET


tree = ET.parse("country.xml")
root = tree.getroot() #获取根节点 <Element 'data' at 0x10d0d1630>

Element对象的常用属性:

  • tag:获取该元素节点的标签
  • attrib:获取该元素节点的属性字典,没有则返回空字典
  • text:若该元素没有再嵌套,返回的就是该元素的内容

遍历

循环遍历
#调用ElementTree类ElementTree(self, element=None, file=None) 
tree = ET.ElementTree(file = "country.xml")
root = tree.getroot()
print(root.tag, ":", root.attrib) # 打印根元素的tag和属性

#遍历root下的一层即第二层
for child in root:
	print(child.tag, ":", child.attrib)
	# 遍历第三层
	for children in child:
		print(children.tag, ":", children.attrib)
通过下标访问
访问root下第一个节点的第二个子节点的文本
print(root[0][1].text)
ElementTree提供的方法
  • find(match) #查找第一个匹配的子元素,match可以是tag或xpath路径
  • findall(match) #返回所有匹配的子元素列表
  • findtext(match, default=None)
  • iter(tag=None) # 以当前元素为根节点,创建树迭代器
  • iterfind(match)
# 过滤所有neighbor标签
for neighbor in root.iter("neighbor"):
	print(neighbor.tag, ":", neighbor.attrib)

# 遍历所有的country标签
for country in root.findall("country"):
	# 查找country标签下的第一个rank标签
	rank = country.find("rank").text
	# 获取country标签的name属性
	name = country.get("name")
	print(name, rank)

修改xml

修改属性

其实元素的属性就是一个字典,可以通过字典的常规操作进行增删查改。

# 将rank标签的文本+1,且添加属性updated为yes~
for rank in root.iter("rank"):
	new_rank = int(rank.text) + 1
	rank.text = str(new_rank)
	rank.set("updated", "yes~")

# 在终端显示整个xml
ET.dump(root)
# 保存输出修改后的内容
tree.write("output.xml")

节点/元素相关

相当于列表的操作,删除元素使用remove,新增元素使用append、extend或insert均可。
list.append(object) 向列表中添加一个对象object
list.extend(sequence) 把一个序列seq的内容添加到列表中

elem1 = ET.Element("test_append")
elem1.text = "elem1"
country.append(elem1)

elem2 = ET.SubElement(country, 'test_subelement')
elem2.text = "elem2"

elem3 = ET.Element("test_extend")
elem3.text = "elem3"
elem4 = ET.Element("test_extend")
elem4.text = "elem4"
country.extend([elem3, elem4])

elem5 = ET.Element("test_insert")
elem5.text = "elem5"
country.insert(5, elem5)