xml.etree.ElementTree
是一個用于處理樹結(jié)構(gòu)的 Python 包轮听。
它可以用于處理任何樹結(jié)構(gòu)的數(shù)據(jù),但最常用于處理 XML 文檔杯拐。
參考文檔:http://effbot.org/zone/element.htm
Element類
from xml.etree.ElementTree import Element
Element類代表了樹節(jié)點霞篡,每個樹節(jié)點包含以下成員(properties):
類成員 | 類型 | 如何獲取 |
---|---|---|
節(jié)點名(tag) | str | Element.tag |
屬性(attributes) | dict | Element.attrib |
文本(text) | str | Element.text |
附加文本(tail) | str | Element.tail |
子節(jié)點列表 | list | Element[:] |
創(chuàng)建樹節(jié)點
創(chuàng)建樹節(jié)點時,一定要指定節(jié)點名:
tree_node = Element("node1")
print(tree_node.tag) # 輸出 node1
print(tree_node.text) # 輸出 None
print(tree_node.tail) # 輸出 None
print(tree_node.attrib) # 輸出 {}
也可在創(chuàng)建時指定屬性(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}
設(shè)置文本(Element.text)或附加文本(Element.tail)
創(chuàng)建節(jié)點后凸郑,可以設(shè)置 text
, tail
等類成員。這些成員的初始值為 None
矛市。
tree_node = Element("node1")
tree_node.text = "Hello world"
tree_node.tail = "Bye"
添加子節(jié)點
可以用 Element.append()
成員函數(shù)添加子節(jié)點:
root = Element("root")
child1 = Element("child1")
child2 = Element("child2")
root.append(child1)
root.append(child2)
訪問子節(jié)點
Element類用私有成員 Element._children
存放子節(jié)點芙沥,該私有成員是一個 list 變量。
為了方便訪問子節(jié)點浊吏,Element封裝了下標(biāo)索引函數(shù),使用時可以把 Element 想象成一個 list
變量:
- 用
len(Element)
檢查子節(jié)點個數(shù) - 用
Element[0]
訪問第0個子節(jié)點找田,Element[1]
訪問第1個子節(jié)點... - 用
for child in Element
遍歷所有子節(jié)點 - 用
Element.remove(child)
刪除某個子節(jié)點
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
樹結(jié)構(gòu)與 XML 字符串的相互轉(zhuǎn)換
使用 xml.etree.ElementTree
包中的 tostring()
和 fromstring()
函數(shù):
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()
參數(shù)不指定 encoding="unicode"
墩衙,函數(shù)將返回 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>
快捷操作
添加子節(jié)點可以用 SubElement
構(gòu)造函數(shù)快速實現(xiàn):
from xml.etree.ElementTree import Element, SubElement
root = Element("root")
child = Element("child")
root.append(child)
# 等價于
root = Element("root")
child = SubElement(root, "child")