XML属性的顺序
我正在使用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