BuZ*_*dEE 7 python xml dom minidom python-3.x
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)
Run Code Online (Sandbox Code Playgroud)
我需要知道是否image_siblings以相同的顺序包含图像,它们被放置在同一层次结构的文档中.
我发现JavaScript 的类似问题,但我不确定Python(版本3.5.2)Minidom是否也是如此getElementsByTagName.
根据代码(在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
Run Code Online (Sandbox Code Playgroud)
这意味着它的顺序getElementByName与你在的顺序相同childNodes.
但只有当tagName出现在同一水平时才会出现这种情况.注意_get_elements_by_tagName_helper同一函数内部的递归调用,这意味着tagName在树中更深处放置的元素将与您在更高级别中的元素交错.
如果您在文档中指的是XML文本文件或字符串,那么问题就会转移到解析器在DOM中创建元素时是否遵守顺序.如果您使用该parse函数xml.dom.minidom,它会在pyexpat库上进行中继,然后使用expatC库.
所以,简短的回答是:
如果您将tagName仅存在于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
Run Code Online (Sandbox Code Playgroud)
似乎解析器尊重xml字符串的排序结构(大多数解析器尊重该顺序,因为它更容易尊重它)但我找不到任何证实它的文档.我的意思是,可能是(奇怪的)情况,解析器,根据文档的大小,从使用列表移动到哈希表来存储元素,这可能会破坏顺序.考虑到XML标准没有指定元素的顺序,因此不遵守顺序的解析器也会受到抱怨.