2016-10-10 121 views
7

Mindom getElementsByTagName的返回元素的顺序与文档中相同层次结构/级别元素的顺序相同吗?minidom中元素的顺序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将包含在同一顺序的图像,它们被放置在文档中的同一层次。

我发现了类似的question JavaScript,但我不确定这是否也适用于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中的元素时遵循顺序。 如果使用xml.dom.minidom中的parse功能,它将在pyexpat库上进行中继,然后依次使用expat C库。

所以,简单的答案是:

如果您有标记名只存在于XML DOM同一水平层次的,那么要想得到尊重。如果在树中更深的其他节点中具有相同的tagName,则这些元素将与较高级别的元素交错。尊重顺序是minidom文档对象中元素的顺序,该顺序取决于解析器。

看看这个例子:

>>> 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标准没有指定元素的顺序,所以不遵守顺序的解析器也会引起投诉。