xml.etree.ElementTree
是一个用于处理树结构的 Python 包。
它可以用于处理任何树结构的数据,但最常用于处理 XML 文档。
参考文档:http://effbot.org/zone/element.htm
Element类
from xml.etree.ElementTree import Element
Element类代表了树节点,每个树节点包含以下成员(properties):
类成员 | 类型 | 如何获取 |
---|---|---|
节点名(tag) | str | Element.tag |
属性(attributes) | dict | Element.attrib |
文本(text) | str | Element.text |
附加文本(tail) | str | Element.tail |
子节点列表 | list | Element[:] |
创建树节点
创建树节点时,一定要指定节点名:
tree_node = Element("node1")
print(tree_node.tag) # 输出 node1
print(tree_node.text) # 输出 None
print(tree_node.tail) # 输出 None
print(tree_node.attrib) # 输出 {}
也可在创建时指定属性(Element.attrib):
tree_node = Element("node2", {"attr1": 1, "attr2": 2})
print(tree_node.tag) # 输出 node2
print(tree_node.text) # 输出 None
print(tree_node.tail) # 输出 None
print(tree_node.attrib) # 输出 {'attr1': 1, 'attr2': 2}
设置文本(Element.text)或附加文本(Element.tail)
创建节点后,可以设置 text
, tail
等类成员。这些成员的初始值为 None
。
tree_node = Element("node1")
tree_node.text = "Hello world"
tree_node.tail = "Bye"
添加子节点
可以用 Element.append()
成员函数添加子节点:
root = Element("root")
child1 = Element("child1")
child2 = Element("child2")
root.append(child1)
root.append(child2)
访问子节点
Element类用私有成员 Element._children
存放子节点,该私有成员是一个 list 变量。
为了方便访问子节点,Element封装了下标索引函数,使用时可以把 Element 想象成一个 list
变量:
- 用
len(Element)
检查子节点个数 - 用
Element[0]
访问第0个子节点,Element[1]
访问第1个子节点... - 用
for child in Element
遍历所有子节点 - 用
Element.remove(child)
删除某个子节点
root = Element("root")
child1 = Element("child1")
child2 = Element("child2")
root.append(child1)
root.append(child2)
print(len(root)) # 2
print(root[0].tag) # child1
root.remove(child1)
print(len(root)) # 1
树结构与 XML 字符串的相互转换
使用 xml.etree.ElementTree
包中的 tostring()
和 fromstring()
函数:
from xml.etree.ElementTree import Element, tostring, fromstring
root = Element("root")
child1 = Element("child1")
child2 = Element("child2")
root.append(child1)
root.append(child2)
tree_str = tostring(root, encoding="unicode")
print(tree_str)
# '<root><child1 /><child2 /></root>''
new_root = fromstring(tree_str)
print(new_root.tag, new_root[0].tag, new_root[1].tag)
# root child1 child2
如果 tostring()
参数不指定 encoding="unicode"
,函数将返回 byte 序列。
再举一个生成 html 的例子:
from xml.etree.ElementTree import Element, tostring
html = Element("html")
head = Element("head")
html.append(head)
title = Element("title")
title.text = "HTML Example"
head.append(title)
body = Element("body")
body.text = "Hello world"
html.append(body)
html_str = tostring(html, encoding="unicode")
print(html_str)
# <html><head><title>HTML Example</title></head><body>Hello world</body></html>
快捷操作
添加子节点可以用 SubElement
构造函数快速实现:
from xml.etree.ElementTree import Element, SubElement
root = Element("root")
child = Element("child")
root.append(child)
# 等价于
root = Element("root")
child = SubElement(root, "child")