lxml保留属性顺序吗?

1 投票
1 回答
1231 浏览
提问于 2025-04-18 18:40

我在用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 个回答

3

在Python中,字典是无序的。当我们把关键字参数传给函数时,通常会用一个叫做**kwargs的字典来传递,因此顺序就会丢失。函数无法知道ET.element的参数是按照什么顺序传入的。

正如这个问题所说,其实没有什么办法能做到这一点。XML并不在乎属性的顺序,所以也没有什么特别的理由去关注这个问题。

撰写回答