xml文档未在minidom中更新

时间:2014-06-26 20:59:10

标签: python xml minidom

我有一个小的XML文件,如下所示:

<cart>
   <items>
      <item id="1" />
   </items>
   <items>
      <item id="2" />
   </items>
</cart>

我希望在<item id = "new item" />下添加新项<items></items>。这是我的代码:

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>并使用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语句的输出。

请注意,新元素未添加到第一个项目块下。但是,for循环中的print语句显示两个items块都添加了新元素,但Document节点&#39; doc&#39;仅显示第二个项目块下的项目。链接到Ideone

上的代码

任何关于我做错了什么的帮助?

1 个答案:

答案 0 :(得分:1)

您不能在多个地方拥有相同的元素。当您追加到第二个节点时,将从第一个节点中删除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())