Elementtree设置属性顺序

时间:2013-01-10 12:28:46

标签: python xml elementtree

我正在尝试编写一个python脚本来标准化通用XML文件,用于配置网站和网站表单。但是要做到这一点,我想维护元素的原始属性排序,或者甚至更好地能够以预定义的方式重新排列它们。目前我尝试过的大多数xml解析器都将属性顺序重写为字母数字。由于这些XML文件是人类读/写和维护的,因此这不太有用。

例如,XML中的泛型元素可能如下所示;

<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X">

但是,一旦通过elementtree并重新写入新文件,则会更改为:

<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text">

由于脚本的目标是标准化大量XML文件,以提高同事之间的可读性,并且元素属性中包含的信息具有不同的重要性(例如,QuestionRef非常重要),请指出属性需要明智地排序。

我理解python dicts(存储在哪些属性中)自然是无序的,XML规范状态属性排序是无关紧要的,但是这个人的可读性因素是脚本背后的驱动力。

在其他问题(在Stack Overflow上)类似于我已经看到它注意到pxdom可以做到这一点(问题链接:link),但我找不到任何提及它如何在pxdom文档或使用谷歌搜索。那么是否有某种方法来维护属性的顺序或使用当前的XML解析器定义它?最好不要求助于热播:)!

任何人都可以提供任何帮助将不胜感激:)。

1 个答案:

答案 0 :(得分:8)

如下所述应用猴子补丁::
ElementTree.py文件中,有一个名为_serialize_xml的函数;
在这个功能;应用下面提到的补丁;

        ##for k, v in sorted(items):  # remove the sorted here
        for k, v in items:
            if isinstance(k, QName):
                k = k.text
            if isinstance(v, QName):
                v = qnames[v.text]
            else:
                v = _escape_attrib(v, encoding)
            write(" %s=\"%s\"" % (qnames[k], v))

这里;移除sorted(items)并将其设为items,就像我上面所做的那样。

另外要禁用基于命名空间的排序(因为在上面的补丁中;当xml属性存在名称空间时,仍然存在排序;否则如果没有名称空间,则上面的工作正常);为此,请将所有{}替换为collections.OrderedDict() ElementTree.py

现在,您已将所有属性添加到该xml元素中。

在完成上述所有操作之前;阅读ElementTree.py

中Fredrik Lundh的版权信息