2011-09-30 26 views
12

私はこのコードをPython 2.7でうまく動作するElementTreeと一緒に使っています。 "X/Y"ノードの下に名前 "A"を持つすべてのノードを取得する必要がありました。ElementTreeのiter()はPython2.6で同等です

from xml.etree.ElementTree import ElementTree 

verboseNode = topNode.find("X/Y") 
nodes = list(verboseNode.iter("A")) 

しかし、Python 2.6で実行しようとすると、このエラーが発生します。

ionCalculateSkewConstraint.py", line 303, in getNodesWithAttribute 
    nodes = list(startNode.iter(nodeName)) 
AttributeError: _ElementInterface instance has no attribute 'iter' 

Python 2.6のElementTreeのノードにiter()がないようです。 iter()をPython 2.6でどのように実装できますか?

答えて

8

は、Python 2.6で利用可能あるiterこと - あなたが本当に交換を必要としないので、(さらには2.5それ以外の場合は、docsでの通知があると思います)。

ただし、findall使用することができます。これはあなたが探しているものであればiter()は2.6で周りのように見えるよう、

def _iter_python26(node): 
    return [node] + node.findall('.//*') 
+0

それはうまく動作します、ありがとう。 iterをfindallと置き換えるだけでOKですか? finadll()があるときにiter()が導入される理由は何でしょうか? – prosseek

+0

@prosseek 'findall'は' iter'よりも強力ですし、潜在的に遅くなる可能性もあります。したがって、本当にすべてのノードが必要な場合は、単に 'iter'を使うべきです。多くの場合、 '/ group/product/price'のような特定のノードだけが必要です。その場合、 'findall'のドキュメンテーションを見てください - それはあなたに多くのPythonコードを保存するかもしれません。 – phihag

+1

次に、エラーの原因は何ですか?私は同じ問題を抱えています:root.iterは2.7で動作し、2.6で上記のエラーが発生します。 findallはそれを修正しました。 – thumbtackthief

15
+0

それは私がいたもの探している。 – skjoshi

+0

情報ありがとうございます。ですから、Python 2.6との互換性を維持するために、非推奨のgetiterator()に明示的に切り替える必要があります。ちょっと私は "なぜ、彼らは最初に古い関数名を非難しましたか"と思うようになります。 – RayLuo

関連する問題