我有一个小XML文件,看起来像这样:
<cart>
<items>
<item id="1" />
</items>
<items>
<item id="2" />
</items>
</cart>
,我想在两个<items></items>
下添加一个新项目<item id = "new item" />
。这是我的代码:
doc = minidom.parseString('<cart><items><item id="1" /></items><items><item id="2" /></items></cart>')
newItem = doc.createElement('item')
newItem.setAttribute('id', 'new item')
items = doc.getElementsByTagName('item')
for item in items:
item.parentNode.appendChild(newItem)
print(item.parentNode.toxml())
print(doc.toprettyxml())
注:我可以采取<items></items>
和使用的项目。appendChild,但我需要<item></item>
元素稍后。这就是为什么使用parentNode.appendChild
这是我得到的输出
<items><item id="1"/><item id="new item"/></items>
<items><item id="2"/><item id="new item"/></items>
<cart>
<items>
<item id="1" />
</items>
<items>
<item id="2" />
<item id="new item" />
</items>
</cart>
前两行是循环内print语句的输出。
看,新元素不会被添加到第一个items块下。但是,for循环中的print语句显示两个items块都添加了新元素,但是Document节点'doc'只显示第二个items块下的项。链接到Ideone上的代码
我做错了什么?
同一个元素不能出现在多个地方。当追加到第二个节点时,newItem将从第一个节点中删除。您可以复制该节点:
doc = minidom.parseString('<cart><items><item id="1" /></items><items><item id="2" /></items></cart>')
newItem = doc.createElement('item')
newItem.setAttribute('id', 'new item')
items = doc.getElementsByTagName('item')
for item in items:
item.parentNode.appendChild(newItem.cloneNode(True))
print(item.parentNode.toxml())
print(doc.toprettyxml())