第七章:数据持久存储与交换-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时,列表中的节点会直接增加到新的父节点。
运行结果:
第七章:数据持久存储与交换-xml.etree.ElementTree:XML操纵API-由节点列表构造树
给定另一个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节点不是输出树的一部分。
运行结果:
第七章:数据持久存储与交换-xml.etree.ElementTree:XML操纵API-由节点列表构造树
要了解重要的一点,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唯一对象标识符,由此强调同一个节点对象可以在输出树中出现多次。
运行结果:
第七章:数据持久存储与交换-xml.etree.ElementTree:XML操纵API-由节点列表构造树