2016-10-10 11 views
7

Mindomの返された要素の順序は、同じ階層/レベルの要素のドキュメント内の要素と同じですか?getElementsByTagNameminidom getElementsByTagNameの要素の順

images = svg_doc.getElementsByTagName('image') 
    image_siblings = [] 
    for img in images: 
     if img.parentNode.getAttribute('layertype') == 'transfer': 
      if img.nextSibling is not None: 
       if img.nextSibling.nodeName == 'image': 
        image_siblings.append(img.nextSibling) 
       elif img.nextSibling.nextSibling is not None and img.nextSibling.nextSibling.nodeName == 'image': 
        image_siblings.append(img.nextSibling.nextSibling) 

私はimage_siblingsは、それらが同じ階層のドキュメントに配置され、同じ順序で画像が含まれているかどうかを知る必要があります。

JavaScriptについても同様のquestionが見つかりましたが、これはPython(バージョン3.5.2)のMinidom getElementsByTagNameでも当てはまりません。

答えて

6

(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標準では要素の順序が指定されていないので、順序を尊重しないパーサーも不平を言います。