如本问题所述:
lxml preserves attributes order?
根据@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'
我该如何解决?
提前致谢!!
答案 0 :(得分:2)
问题是你正在向Element()
init方法发送两次相同的关键字参数。对于初始化,您的第二个参数将用作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"