lxml 属性顺序

2 投票
1 回答
816 浏览
提问于 2025-04-18 18:44

在这个问题中提到:

lxml是否保留属性的顺序?

根据@abarnet的建议,我写了以下这行代码:

root = ET.Element('{%s}Catalogo' % SATNS, OrderedDict([("Ano","2014"),("Mes","02"),("TotalCtas","219"),("RFC","XXX010101XXX"),("Version","1.0")]), nsmap={'catalogocuentas':SATNS})

我得到了这个结果:

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

这个结果很好(它保留了我想要的顺序),但是当我想要添加缺失的信息时:

xmlns:xsi="link_2" xsi:schemaLocation="http://www.sat.gob.mx/catalogocuentas"

作为我的xml的一部分,然后我在我的python代码中添加这个信息:

attrib={location_attribute: 'http://www.sat.gob.mx/catalogocuentas'}

这样就变成了:

root = ET.Element('{%s}Catalogo' % SATNS, OrderedDict([("Ano","2014"),("Mes","02"),("TotalCtas","219"),("RFC","XXX010101XXX"),("Version","1.0")]), nsmap={'catalogocuentas':SATNS}, attrib={location_attribute: 'http://www.sat.gob.mx/catalogocuentas'})

但我得到了这个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "lxml.etree.pyx", line 2558, in lxml.etree.Element (src/lxml/lxml.etree.c:52829)
TypeError: Element() got multiple values for keyword argument 'attrib'

我该如何解决这个问题呢?

提前谢谢大家!!

1 个回答

2

问题在于你在调用 Element() 的初始化方法时,给了同一个关键字参数两次。在你的初始化过程中,第二个参数被当作 attrib 关键字使用了。在这个情况下,它是你的 OrderedDict(),里面包含了所有的属性。然后你又试图再提供一次,这就导致了冲突。你可以通过两种方式来解决这个问题:

你可以像下面这样把这个属性添加到你的属性 OrderedDict() 中:

root = ET.Element('{%s}Catalogo' % SATNS, OrderedDict([("Ano","2014"),("Mes","02"),("TotalCtas","219"),("RFC","XXX010101XXX"),("Version","1.0"),("location_attribute","http://www.sat.gob.mx/catalogocuentas")]), nsmap={'catalogocuentas':SATNS})

另外,你也可以在下一行这样添加:

root.attrib["location_attribute"] = "http://www.sat.gob.mx/catalogocuentas"

撰写回答