Python 使用minidom修改时保留属性的顺序

Python 使用minidom修改时保留属性的顺序,python,xml,minidom,Python,Xml,Minidom,在使用minidom处理XML时,有没有办法保持属性的原始顺序 假设我有: 当我用minidom修改它时,属性会按字母顺序蓝、绿和红重新排列。我想保留原来的秩序 我通过循环通过elements=doc.getElementsByTagName('color')返回的元素来处理文件,然后执行类似e.attributes[“red”].value=“233”的赋值 在使用minidom处理XML时,有没有办法保持属性的原始顺序 对于minidom no,用于存储属性的数据类型是无序字典。可以做到这一

在使用minidom处理XML时,有没有办法保持属性的原始顺序

假设我有:
当我用minidom修改它时,属性会按字母顺序蓝、绿和红重新排列。我想保留原来的秩序

我通过循环通过
elements=doc.getElementsByTagName('color')
返回的元素来处理文件,然后执行类似
e.attributes[“red”].value=“233”
的赋值

在使用minidom处理XML时,有没有办法保持属性的原始顺序


对于minidom no,用于存储属性的数据类型是无序字典。可以做到这一点,但速度要慢得多。

我最终使用了库而不是minidom。

很明显,xml属性没有排序。 我刚刚发现了这种奇怪的行为

这似乎与xml.dom.minidom.Element.writexml函数中添加的排序有关

class Element(Node):
... snip ...

    def writexml(self, writer, indent="", addindent="", newl=""):
        # indent = current indentation
        # addindent = indentation to add to higher levels
        # newl = newline string
        writer.write(indent+"<" + self.tagName)

        attrs = self._get_attributes()
        a_names = attrs.keys()
        a_names.sort()
--------^^^^^^^^^^^^^^
        for a_name in a_names:
            writer.write(" %s=\"" % a_name)
            _write_data(writer, attrs[a_name].value)
            writer.write("\"")
类元素(节点):
... 剪
def writexml(self、writer、indent=“”、addendent=“”、newl=“”):
#缩进=当前缩进
#addindent=要添加到更高级别的缩进
#newl=换行字符串

writer.write(indent+“为了保持属性的顺序,我在minidom中做了这个小小的修改:

from collections import OrderedDict
在元素类中:

__init__(...)
    self._attrs = OrderedDict()
    #self._attrs = {}
writexml(...)
    #a_names.sort()
现在,这只适用于Python2.7+ 我不确定它是否真的有效=>使用风险自负

请注意,您不应依赖属性顺序:


请注意,开始标记或空元素标记中属性规范的顺序并不重要。

在Python 2.7之前,我使用了以下热补丁:

使用这种方式:

with _MinidomHooker():
    document.writexml(...)
免责声明:

  • 你不应该依赖属性的顺序
  • 改变NamedNodeMap类不是线程安全的
  • 热补丁是邪恶的

  • 你们可以发布任意数量的免责声明。 虽然对属性重新排序对程序没有意义,但对程序员/用户却有意义

    对于弗雷德里克来说,RGB的顺序很重要,因为颜色的顺序就是这样的。 对我来说,这是一个特别的名称属性

    比较

    <field name="url" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <!-- ID -->
    <field name="forkortelse" type="string" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="kortform" type="text_general" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="dato" type="date" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="nummer" type="int" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="kilde" type="string" indexed="true" stored="true" required="false" multiValued="false" />
    <field name="tittel" type="text_general" indexed="true" stored="true" multiValued="true"/>
    
    
    
    反对

    <field indexed="true" multiValued="false" name="forkortelse" required="false" stored="true" type="string"/>
    <field indexed="true" multiValued="false" name="kortform" required="false" stored="true" type="text_general"/>
    <field indexed="true" multiValued="false" name="dato" required="false" stored="true" type="date"/>
    <field indexed="true" multiValued="false" name="nummer" required="false" stored="true" type="int"/>
    <field indexed="true" multiValued="false" name="kilde" required="false" stored="true" type="string"/>
    <field an_optional_attr="OMG!" an_optional_attr2="OMG!!" indexed="true" name="tittel" stored="true" type="text_general"/>
    
    
    
    虽然阅读并非不可能,但也不是那么容易。名称是重要的属性。将名称字段隐藏在后面是不好的。如果名称左侧有15个属性,前面的7个属性是可选的,该怎么办

    问题在于,重新排序比ACS排序所带来的回报更大。它会影响程序员的思维方式或功能的工作方式。至少排序应该是可配置/可选的


    请原谅我的英语不好。它不是我的主要语言。

    1.自定义您自己的'Element.writexml'方法。

    从“minidom.py”将元素的writexml代码复制到您自己的文件中

    将其重命名为writexml_nosort

    删除“a_names.sort()”(python 2.7) 或者将“a_names=sorted(attrs.keys())”更改为“a_names=attrs.keys()”(python 3.4)

    将元素的方法更改为您自己的方法:

    minidom.Element.writexml=writexml\u nosort

    2.定制您最喜欢的订单:

    右顺序=['a','b','c','a1','b1']

    3.调整元素属性


    node.\u attrs=OrderedDict([(k,node.\u attrs[k]),用于按正确的顺序排列的k])

    在类元素中使用writexlm函数进行写入时,属性以最小的形式排列。 是这样做的:

    a-name = sorted(attrs.keys())
    
    您可以将此更改为

    a-name = list(attrs.keys())
    
    由于空闲,我不得不在中更改文件
    /usr/lib/python3.6/xml/dom
    。Idle似乎没有遵循
    sys.path
    的顺序。 别忘了先做个备份

    在使用XML处理时,有没有一种方法可以保持属性的原始顺序 迷你们

    是的。在Python3.8中,序列化XML文档时保留原始属性顺序


    请参阅。

    您是如何修改元素类的?仍然适用于Python 3.2,将
    a\u names=sorted(attrs.keys())
    替换为
    a\u names=attrs.keys()
    你在这里所说的并不是无理的。但这并不是对问题的回答。我不明白我完全同意你所说的,但这确实应该是一个评论,尽管它太大了。
    a-name = list(attrs.keys())