【问题标题】:lxml preserves attributes order?lxml 保留属性顺序?
【发布时间】:2014-08-27 03:18:09
【问题描述】:

我正在使用 minidom 编写应用程序,但 minidom 不保留属性顺序(按字母顺序排序),所以我决定使用 lxml。

但是在以下代码行中,我没有得到想要的顺序:

import lxml.etree as ET
SATNS = "link_1"
NS = "link_2"
location_attribute = '{%s}schemaLocation' % NS
root = ET.Element('{%s}Catalogo' % SATNS, nsmap={'catalogocuentas':SATNS}, attrib=
   {location_attribute: 'http://www.sat.gob.mx/catalogocuentas'}, Ano="2014",       Mes="02",   TotalCtas="219", RFC="ALF040329CX6", Version="1.0")
print (ET.tostring(root, pretty_print=True))

这是我期望得到的:

<catalogocuentas:Catalogo xmlns:catalogocuentas="link_1"
xmlns:xsi="link_2" xsi:schemaLocation="http://www.sat.gob.mx/catalogocuentas"
Ano="2014" Mes="02" TotalCtas="219" RFC="XXX010101XXX" Version="1.0">
</catalogocuentas:Catalogo>

按照我填写的顺序:

root=ET.element(...)

但我要的是下一个,没有顺序:

<catalogocuentas:Catalogo xmlns:catalogocuentas="link_1" 
xmlns:xsi="link_2" RFC="ALF040329CX6" Version="1.0" 
Mes="02" xsi:schemaLocation="http://www.sat.gob.mx/catalogocuentas" Ano="2014" TotalCtas="219">
</catalogocuentas:Catalogo>

有没有办法解决这个问题?

提前致谢!!

【问题讨论】:

  • 我很确定有一种方法可以为 lxml 提供一个用于属性字典的自定义字典类型,因此您可以将其传递给 collections.OrderedDict。然而,正如帕特里克柯林斯的回答所解释的那样,这几乎绝对是一个坏主意。 (IIRC,您可以通过继承默认解析器类或创建默认类的实例并在其上设置成员,然后将其作为parser= 参数传递给Element 构造函数@987654331 @ 函数,或者其他任何你开始的东西。
  • 话虽如此,如果你想让它保持顺序,你必须首先按顺序给它属性,并且函数的关键字参数是任意排序的。 (请参阅PEP 468 以获取改变这一点的公开提议,但它似乎停滞不前,尽管经过一番讨论后 Guido 和核心开发人员对这个想法相对持开放态度......)

标签: python xml lxml minidom


【解决方案1】:

Python 中的字典是unordered。关键字参数通过传统上名为**kwargs 的字典传递给函数,因此the order is lost。该函数不可能知道ET.element 的参数的输入顺序。

正如in this question 所述,实际上没有任何方法可以完成这项工作。 XML 不关心属性顺序,因此没有任何好的理由这样做。

【讨论】:

  • 我完全同意你的看法,这里的问题是我需要将我的 XML 发送到一个不接受我的 XML 的 XML 验证器,如果它不是我想要达到的定义的顺序
  • @DiegoCalzadilla XML 验证器有一个(非常严重的)错误,您应该向维护它的人提交报告。
  • @DiegoCalzadilla 来自我链接的第三个问题:“据我所知,lxml 没有指定出现在序列化 XML 中的订单属性的机制,如果有,我会感到惊讶。”跨度>
  • @DiegoCalzadilla 看起来 html5lib 可能有你想要的:github.com/html5lib/html5lib-python/issues/37
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2011-02-14
相关资源
最近更新 更多