xml.etree.ElementTree 简介

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)
# '''

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 ExampleHello world

快捷操作

添加子节点可以用 SubElement 构造函数快速实现:

from xml.etree.ElementTree import Element, SubElement

root = Element("root")
child = Element("child")
root.append(child)

# 等价于

root = Element("root")
child = SubElement(root, "child")

你可能感兴趣的:(xml.etree.ElementTree 简介)