(Pythonの2.7で)コードによると、コードは_get_elements_by_tagName_helper
機能、上getElementsByName
方法リレー:
def _get_elements_by_tagName_helper(parent, name, rc):
for node in parent.childNodes:
if node.nodeType == Node.ELEMENT_NODE and \
(name == "*" or node.tagName == name):
rc.append(node)
_get_elements_by_tagName_helper(node, name, rc)
return rc
これが何を意味するのかはgetElementByName
における順序は、あなたが持っていることと同じであるということですchildNodes
にあります。
しかし、これは、tagName
が同じレベルにのみ表示される場合にのみ該当します。同じ関数内に_get_elements_by_tagName_helper
という再帰呼び出しがあることに注意してください。つまり、同じ深さにあるtagName
の要素は、より高いレベルのものとインターリーブされます。
文書あなたがXMLテキストファイルまたは文字列を意味する場合、質問は、DOMで要素を作成するときにパーサが順序を尊重するかどうかに移されます。 parse
機能をxml.dom.minidom
から使用する場合は、pyexpat
ライブラリに中継し、expat
Cライブラリを使用します。
ので、短い答えは次のようになります。
あなたがXML DOM内の階層の同じレベルにのみ存在tagNameをを持っている場合は、注文が尊重されます。ツリー内の他のノードに同じtagNameがある場合、それらの要素はより高いレベルのものとインターリーブされます。尊重された順序は、ミニダムドキュメントオブジェクト内の要素の順序であり、その順序はパーサーによって異なります。
ルックこの例:
>>> import StringIO
>>> from xml.dom.minidom import parseString
>>> s = '''<head>
... <tagName myatt="1"/>
... <tagName myatt="2"/>
... <tagName myatt="3"/>
... <otherTag>
... <otherDeeperTag>
... <tagName myatt="3.1"/>
... <tagName myatt="3.2"/>
... <tagName myatt="3.3"/>
... </otherDeeperTag>
... </otherTag>
... <tagName myatt="4"/>
... <tagName myatt="5"/>
... </head>'''
>>> doc = parseString(s)
>>> for e in doc.getElementsByTagName('tagName'):
... print e.getAttribute('myatt')
...
1
2
3
3.1
3.2
3.3
4
5
パーサがXML文字列の順序構造を尊重するようだ(それを尊重することが容易であるため、ほとんどのパーサはその順序を尊重する)が、私はいずれかを見つけることができませんでしたそれを確認する文書。つまり、文書のサイズに応じて、パーサーがリストを使用してハッシュテーブルに移動して要素を格納すると、その順序が壊れる可能性がある(奇妙な)ケースかもしれません。 XML標準では要素の順序が指定されていないので、順序を尊重しないパーサーも不平を言います。