Python/Minidom:在NodeLis上迭代

2024-10-04 09:26:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个解析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节点进行迭代,将跳过一个元素。 你知道这个问题的起因吗?


Tags: textnameinnodefor语法domprint
2条回答

appendChild()将执行以下操作: enter image description here

我只是从代码中学习,使用tuple()可以做到这一点。

在迭代元素时,您正在将元素移出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远比XML DOM API更具pythononic性,使用起来也更容易:

from xml.etree import ElementTree as ET

etree = ET.fromstring(data)
for element in etree.findall('messageList'):
    print element

相关问题 更多 >