第七章:数据持久存储与交换-xml.etree.ElementTree:XML操纵API-由节点列表构造树
7.5.11 由节点列表构造树
利用extend()方法可以将多个子节点一同增加到一个Element实例。extend()的参数都可以是任意的iterable。包括list或另一个Element实例。
from xml.etree.ElementTree import Element,tostring
from ElementTree_pretty import prettify
top = Element('top')
children = [
Element('child',num=str(i))
for i in range(3)
]
top.extend(children)
print(prettify(top))
给定一个list时,列表中的节点会直接增加到新的父节点。
运行结果:
给定另一个Element实例时,该节点的子节点会增加到新的父节点。
from xml.etree.ElementTree import (Element,SubElement,tostring,
XML,
)
from ElementTree_pretty import prettify
top = Element('top')
parent = SubElement(top,'parent')
children = XML(
'<root><child num="0" /><child num="1" />'
'<child num="2" /></root>'
)
parent.extend(children)
print(prettify(top))
在这个例子中,通过解析XML串创建的root节点有3个子节点,它们都增加到parent节点。root节点不是输出树的一部分。
运行结果:
要了解重要的一点,extend()并不改变节点现有的父子关系。如果传入extend()的值已经存在于树中的某个位置,那么它们仍在原处,并在输出中重复。
from xml.etree.ElementTree import (Element,SubElement,tostring,
XML,
)
from ElementTree_pretty import prettify
top = Element('top')
parent_a = SubElement(top,'parent',id='A')
parent_b = SubElement(top,'parent',id='B')
# Create children.
children = XML(
'<root><child num="0" /><child num="1" />'
'<child num="2" /></root>'
)
# Set the id to the Python object id of the node
# to make duplicates easier to spot.
for c in children:
c.set('id',str(id(c)))
# Add to first parent.
parent_a.extend(children)
print('A:')
print(prettify(top))
print()
# Copy nodes to second parent.
parent_b.extend(children)
print('B:')
print(prettify(top))
print()
这里将这些子节点的id属性设置为Python唯一对象标识符,由此强调同一个节点对象可以在输出树中出现多次。
运行结果: