节点List相关操作
为方便遍历子节点,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不见了