在Python中解析XML并且我的'NodeList'对象没有属性'len'

时间:2012-04-15 03:08:04

标签: python xml minidom

我是Python的新手,并试图编写一个解析一些XML的程序。我遇到的问题是,当我尝试在我认为是NodeList的地方调用.len()时,我得到了错误'NodeList' object has no attribute 'len'。这对我来说真的很令人惊讶,因为documentation说:

  

此外,Python DOM接口要求提供一些额外的支持以允许NodeList对象用作Python序列。所有NodeList实现必须包括对 len ()

的支持

这是我的代码:

import xml.dom.minidom

def testFunction(translationDOM):
    textCollection = translationDOM.getElementsByTagName("onscreen_text")
    for onscreenText in textCollection:
        print textCollection.len()

然后在Main() ...

translationDom  = parse(xmlFileName)
testFunction(translationDom)

我不想在这里发布我的整个xml(它的大量),但有许多类似于以下的块:

<onscreen_text>
    <source id="2036" unique_name="blah" should_be_translated="True">
    ....
 </onscreen_text>

这是完整的错误文本:

  File "trophytool.py", line 155, in <module>
    main()
  File "trophytool.py", line 134, in main
    testFunction(translationDom)
  File "trophytool.py", line 64, in testFunction
    print textCollection.len()
AttributeError: 'NodeList' object has no attribute 'len'

您认为它会打印出找到的<onscreen_text>代码的数量,但事实并非如此。这是为什么?

2 个答案:

答案 0 :(得分:1)

请改为尝试:

print len(textCollection)

说明:对len的支持通常意味着一个类实现__len__()方法(而不是len()),这反过来允许您调用len(object)

答案 1 :(得分:1)

方法getElementsByTagName()始终返回一个列表,即使只有一个项目。 例如在下一个xml

<school>
   <department />
</school>

如果你有指向“school”标签的指针并且你打电话

myNode.getElementsByTagName("department")

它将返回长度为1的节点列表

如果您确定对方法getElementsByTagName()的调用只返回一个项目,则可以执行此操作而不是上述语句

myNode.getElementsByTagName("department").item(0)

它将返回单个节点,而不是只有一个节点的节点列表。