从for循环内部将多个元素插入xml时进行字符串插值



由于某些原因,我发现很难通过在for循环中插入多个节点来生成XML文件。以下内容确实做到了这一点,但仍有几个问题。

给定字典列表

dict_list = [{'x': 'abc', 'y': 'efg'}, 
{'x': 'hij', 'y': 'klm'}]

我可以使用objectify()生成所需的xml:

from lxml import etree, objectify
end_game = etree.XML('<final_root/>')
E = objectify.ElementMaker(annotate=False)
tmp_root = E.entry
for d in dict_list:
att_values = [val for val in d.values()]    
doc = tmp_root(   
x = att_values[0],
y = att_values[1]
)    
end_game.append(doc)
print(etree.tostring(end_game, pretty_print=True).decode())

输出,根据需要:

<final_root>
<entry x="abc" y="efg"/>
<entry x="hij" y="klm"/>
</final_root>

问题是,我需要将属性名称xy硬连接到循环中。尝试使用字符串插值失败。例如:

for d in dict_list:
att_items = [item for item in d.items()] 
doc = tmp_root(   
att_items[0][0] = att_items[0][1],
att_items[1][0] = att_items[1][1]
)

提高

SyntaxError:表达式不能包含赋值,也许您的意思是"=="?

使用f字符串('f'{att_items[0][0]}' = att_items[0][1](或格式({}.format(att_items[0][0]) = att_items[0][1](会引发相同错误。

那么,显而易见的问题是:有没有办法避免手动插入属性名称?或者:是否可以使用lxml.etree来复制结果(也许可以避免问题(?

由于etree元素作为dict携带属性,因此在构造Element时应该能够直接传入dict。。。

from lxml import etree
end_game = etree.XML('<final_root/>')
dict_list = [{'x': 'abc', 'y': 'efg'},
{'x': 'hij', 'y': 'klm'}]
for meta in dict_list:
end_game.append(etree.Element('item', meta))
print(etree.tostring(end_game, pretty_print=True).decode())

打印输出。。。

<final_root>
<item x="abc" y="efg"/>
<item x="hij" y="klm"/>
</final_root>

最新更新