【问题标题】:Python / Minidom : Iterate on a NodeListPython / Minidom:在 NodeList 上迭代
【发布时间】:2012-09-20 09:50:34
【问题描述】:

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

【问题讨论】:

    标签: python xml minidom


    【解决方案1】:

    您正在将元素移出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 更 Python 且更易于使用:

    from xml.etree import ElementTree as ET
    
    etree = ET.fromstring(data)
    for element in etree.findall('messageList'):
        print element
    

    【讨论】:

      【解决方案2】:

      appendChild() 将执行以下操作:

      我只是从代码中学到的,使用 tuple() 可能会成功。

      【讨论】:

        猜你喜欢
        • 2015-09-25
        • 2020-07-31
        • 2022-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        相关资源
        最近更新 更多