XML属性的顺序

4 投票
2 回答
3279 浏览
提问于 2025-04-18 10:46

我正在使用Python和ElementTree来修改一些XML文件的属性。 一切都运行得很好,但修改后的文件中属性的顺序和之前的不一样了。 为了保持顺序,我尝试了这个方法:

ordered_keys = ('t', 's', 'sp', 'id', 'le')

for k in ordered_keys:
    if k in sp.attrib:
        sp.set(k, sp.attrib[k])

tree.write("output.xml", encoding='utf-8', xml_declaration=True)

但是也没有成功 :( 你有没有什么办法可以保持顺序?

2 个回答

2

对于电脑来说,元素的顺序并不重要,所以使用无序字典是合理的。

不过,如果你希望用户能按顺序阅读这些元素,这并不违反规范。看起来你可以通过稍微修改标准的ElementTree来实现这个功能。这个文件是 ElementTree.py,在lib的xml.etree目录下。

首先,Element对象默认使用的是一个标准的无序字典来存储属性。你需要把它改成有序字典。这个类的定义大约在我用的python 2.6版本的第450行。在python 2.7及以上版本中,这个有序字典在collections模块里,而在python 2.6中,你可以在网上找到一个移植的实现。

其次,默认情况下,它在写入时会对键进行排序(这样可以更容易理解)。你需要把这个功能关掉。这个设置在 ElementTree.write() 方法中,里面有一行代码大概是 items.sort()。把这一行注释掉就可以了。在python 2.6版本中,这大约是第688行。

这两步结合起来,你就可以创建一个树形结构,并按你自己的顺序写入属性。如果你也想按顺序读取文件(我还没测试过这部分),你还需要修改解析器:

看起来相关的函数是 _start_start_list(在 XMLTreeBuilder 内部),这两个函数里都有 attrib = {} 的声明,你也需要把它改成有序字典。

2

XML节点的属性是没有顺序的,这一点是有定义的。换句话说,属性的排列顺序并不重要。

相关链接:

撰写回答