为方便遍历子节点,lxml将节点list的操作尽可能的与python处理list的方式一样保持一致
创建XML
from lxml import etree
root = etree.Element("root") #创建根节点
root.append(etree.Element("child1")) #创建子节点child1
child2 = etree.SubElement(root, "child2") #创建子节点child2
child3 = etree.SubElement(root, "child3") #创建子节点child3
具体的xml文件结构如下:
<root>
<child1></child1>
<child2></child2>
<child3></child3>
</root>
获取当前节点指定索引处子节点
child = root[0]
print(child.tag) #输出:child1
获取当前节点子节点个数
print(len(root)) #输出:3
获取节点在父节点中的索引
print(root.index(root[1])) #输出:1
子节点遍历
children = list(root)
for child in children:
print(child.tag)
#或
for child in root:
print(child.tag)
子节点插入
root.insert(0, etree.Element("child0"))
节点List操作
start = root[:1]
end = root[-1:]
print(start[0].tag) #输出:child0
print(end[0].tag) #输出:child3
包含子节点判断
#不推荐:
if root:
print("The root element has children")
#推荐: 该种方式更能让人读懂是用来判断节点是否包含子节点的
if len(root):
print("The root element has children")
父节点判断
print(root is root[0].getparent()) #输出:True
相邻节点判断
print(root[0] is root[1].getprevious()) #输出:True
print(root[1] is root[0].getnext()) #输出:True
节点判断
print(etree.iselement(root)) #输出:True
root11=''
print(etree.iselement(root11)) #输出:False,因为root11只是变量
子节点移动
for child in root:
print(child.tag)
'''输出:
child0
child1
child2
child3
'''
root[0] = root[-1] #child3是移动到了index为0的位置,它覆盖了child1
for child in root:
print(child.tag)
'''输出:
child3
child1
child2
'''
子节点拷贝
如果要将元素复制到lxml.etree中的其他位置,请考虑使用python标准库中的copy模块创建一个独立的深度复制
from lxml import etree
from copy import deepcopy
root = etree.Element("root") #创建根节点
root.append(etree.Element("child1")) #创建子节点child1
child2 = etree.SubElement(root, "child2") #创建子节点child2
child3 = etree.SubElement(root, "child3") #创建子节点child3
element = etree.Element("neu")
element.append(deepcopy(root[1]))
print(element[0].tag) #输出:child2
print([ c.tag for c in root ]) #输出:['child1', 'child2', 'child3'],原root节点下的子节点没有变化
element01 = etree.Element("neu01")
element01.append(root[1])
print(element01[0].tag) #输出:child2
print([ c.tag for c in root ]) #输出:['child1', 'child3'],原root节点下的子节点有变化,child2不见了