我正在制作一个解析XML文件的Python程序。我需要迭代NodeList,但是我在使用“for Node in NodeList”语法时遇到了问题。
以下是代码示例:
docToInclude = parse(node.getAttribute("file"))
print ("childNode count : " , len(docToInclude.documentElement.childNodes))
print ("childNodes : " , docToInclude.documentElement.childNodes)
print("")
for i in range(0, len(docToInclude.documentElement.childNodes)):
print ("i = ", i , "nodeName = " + docToInclude.documentElement.childNodes[i].nodeName)
print("")
for elementNode in docToInclude.documentElement.childNodes :
print ("node name : " , elementNode.nodeName)
node.parentNode.insertBefore(elementNode, insertPosition)
这是输出:
childNode count : 3
childNodes : [<DOM Text node "'\n\n\t'">, <DOM Element: messageList at 0x3a4e570>, <DOM Text node "'\n\n'">]
i = 0 nodeName = #text
i = 1 nodeName = messageList
i = 2 nodeName = #text
node name : #text
node name : #text
如果我在NodeList语法中迭代for节点,则跳过一个元素。 你对这个问题的起源有什么看法吗?
答案 0 :(得分:2)
您正在迭代它们时将元素移出childNodes
。此更改 childNodes
列表:
>>> lst = [1, 2, 3]
>>> for i, elem in enumerate(lst):
... print i, elem
... del lst[i]
...
0 1
1 3
您必须迭代列表的副本;在这里,我使用[:]
切片表示法创建列表的副本:
for elementNode in docToInclude.documentElement.childNodes[:]:
print ("node name : " , elementNode.nodeName)
node.parentNode.insertBefore(elementNode, insertPosition)
尽管如此,请使用ElementTree API代替您;该API远比Python DOM API更易于使用且更易于使用:
from xml.etree import ElementTree as ET
etree = ET.fromstring(data)
for element in etree.findall('messageList'):
print element
答案 1 :(得分:0)
appendChild()将执行以下操作:
我只是从代码中学习它,使用tuple()可以做到这一点。