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"