2014-06-23 82 views
3

我正在使用Python和ElementTree来修改XML文件的某些属性。 一切工作正常,但修改后的文件的属性顺序不再像以前一样。 为了维持秩序,我这个黑客试了一下: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

XML信息集规范(http://www.w3.org/TR/xml-infoset/#infoitem.element)指出元素中的属性构成*无序*集合。即,顺序没有意义,并且允许实现自由地对属性重新排序。 – ach

回答

1

对于一台电脑,有没有需要订购的元素 - 这不是必要的,无序字典是有道理的。

但是,如果您希望订购它们供用户阅读,这不违反规范。看起来你可以通过少量(或分叉)标准ElementTree来做到这一点。该文件是在lib下的xml.etree中的ElementTree.py

首先,Element对象默认使用标准的无序字典作为属性。将其更改为使用有序字典。这个类的定义是在我的python 2.6中的〜450行。在py2.7 +中,这是在集合中,在py2.6中,您可以在Web上找到一个backported实现。

其次,默认情况下它会在写入时对键进行排序(以帮助理解它们)。你需要关闭它。它在ElementTree.write(),并且该行只是说了一些像items.sort()。注释掉。这是python 2.6版本中的〜688行。

这两者一起允许您创建一棵树并按您自己的顺序编写属性。 如果你想阅读,以便过的文件(我没有实际测试过这一部分),您还需要修改解析器:

貌似功能_start_start_list(内XMLTreeBuilder),这两个声明attrib = {},改变它也是一个有序的字典。

+0

感谢您的评论!为了我的目的,我认为这太复杂了。但是我还有一个想法:是否可以简单地将所有属性添加为一行字符串? – MarkF6

+0

非常好的答案! @ MarkF6能否描述为什么你需要特定顺序的属性? – alecxe

+0

这只是为了读者的习惯。但是,是的,事实上,这不是很重要...... – MarkF6