lxml保留属性顺序?

时间:2014-08-27 03:18:09

标签: python xml lxml minidom

我正在使用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>

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

提前致谢!!

1 个答案:

答案 0 :(得分:3)

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

正如in this question所述,实际上没有办法完成任务。 XML并不关心属性顺序,所以没有任何理由这样做。