从Mindom 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也有类似的问题,但我不确定Python(3.5.2版本(MinidomgetElementsByTagName
是否也是如此。
根据代码(Python 2.7中(,getElementsByName
方法中继_get_elements_by_tagName_helper
函数,代码为:
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
的元素(位于树中较深的位置(将与您在更高级别中的元素交错。
如果document指的是XML文本文件或字符串,那么问题就转移到解析器在DOM中创建元素时是否遵守顺序。如果使用xml.dom.minidom
中的parse
函数,它会中继pyexpat
库,然后使用expat
C库。
因此,简短的答案是:
如果tagName只存在于XMLDOM中的同一层次结构级别中,则遵循顺序。如果在树中更深的其他节点中具有相同的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标准并没有指定元素的顺序,所以不尊重顺序的解析器也会受到抱怨。