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