gpt4 book ai didi

python - 来自 minidom getElementsByTagName 的元素顺序

转载 作者:太空狗 更新时间:2023-10-29 21:45:27 25 4
gpt4 key购买 nike

从 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 是否会以相同的顺序包含图像,它们被放置在同一层次结构的文档中。

我找到了一个类似的 question对于 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

这意味着 getElementByName 中的顺序与您在 childNodes 中的顺序相同。

但这只有在 tagName 只出现在同一层级时才成立。请注意同一函数内 _get_elements_by_tagName_helper 的递归调用,这意味着具有相同 tagName 且位于树中更深处的元素将与您在更高层次。

如果您所说的文档是指 XML 文本文件或字符串,那么问题就转移到解析器在创建 DOM 中的元素时是否遵守顺序。如果您使用 xml.dom.minidom 中的 parse 函数,它会依赖于 pyexpat 库,后者又使用 expat C 库。

所以,简短的回答是:

If you have the tagName only present in the same level of hierarchy in the XML DOM, then the order is respected. If you have the same tagName in other nodes deeper in the tree, those elements will be interleaved with the ones of higher level. The respected order is the order of the elements in the minidom document object, which order depends on the parser.

看这个例子:

>>> 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 标准没有指定元素的顺序,因此不遵守顺序的解析器也会受到投诉。

关于python - 来自 minidom getElementsByTagName 的元素顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39957761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com