我有这个数组需要转换为xml。
array = [
{
'time': {"hour":"1", "minute":"30","seconds": "40"}
},
{
'place': {"street":"40 something", "zip": "00000"}
}
]
xml应该有一个我可以作为变量输入的标题,例如
xml_title = "test"
我想要的结果基于上面的数组和xml标题是这样的:
<test>
<time hour="1" minute="30" second="40"></time>
<place>
<street>40 something</street>
<zip>00000</zip>
</place>
</test>
我喜欢在类似的堆栈溢出问题(https://stackoverflow.com/a/18991263/875139)中给出的答案,但我很困惑如何使用该答案来获得所需的结果。
请帮助。
答案 0 :(得分:11)
如评论中所述,您的原始问题会混合属性和元素。如果您希望所有内容都是元素,那么您可以使用dicttoxml
。例如:
from dicttoxml import dicttoxml
array = [
{
'time': {"hour":"1", "minute":"30","seconds": "40"}
},
{
'place': {"street":"40 something", "zip": "00000"}
}
]
xml = dicttoxml(array, custom_root='test', attr_type=False)
生成以下XML:
<?xml version="1.0" encoding="UTF-8" ?>
<test>
<item>
<time>
<seconds>40</seconds>
<minute>30</minute>
<hour>1</hour>
</time>
</item>
<item>
<place>
<street>40 something</street>
<zip>00000</zip>
</place>
</item>
</test>
如果您可以将字典转换为:
dictionary = {
'time': {"hour":"1", "minute":"30","seconds": "40"},
'place': {"street":"40 something", "zip": "00000"}
}
然后您的XML将按预期显示。
<?xml version="1.0" encoding="UTF-8" ?>
<test>
<place>
<street>40 something</street>
<zip>00000</zip>
</place>
<time>
<seconds>40</seconds>
<minute>30</minute>
<hour>1</hour>
</time>
</test>
请注意,通常情况下,字典键的顺序无法保证,因此如果您想保留dict
中的键顺序,可能需要查看collections.OrderedDict
。
答案 1 :(得分:0)
我最终获取了solution from here,然后在数组中的元素上添加了for循环。但是,输出使用属性而不是像你所问的那样的元素。
该功能之外的完整代码就是这个。我最终使用正则表达式去除中间<test></test>
标签,然后将结果放在外面。
import re
array = [
{
'time': {"hour":"1", "minute":"30","seconds": "40"}
},
{
'place': {"street":"40 something", "zip": "00000"}
}
]
xml_title = "test"
xml_tag_pattern = re.compile(r'</?{}>'.format(xml_title))
inner_xml = re.sub(xml_tag_pattern, '', ''.join(dict2xml(e, root_node=tag_name) for e in array))
print('<{0}>{1}</{0}>'.format(xml_title, inner_xml))
输出为此(为清晰起见添加了新行)
<test>
<time hour="1" seconds="40" minute="30"/>
<place street="40 something" zip="00000"/>
</test>
答案 2 :(得分:0)
对于简单的情况,您可以使用类似这样的内容:
def object_to_xml(data: Union[dict, bool], root='object'):
xml = f'<{root}>'
if isinstance(data, dict):
for key, value in data.items():
xml += object_to_xml(value, key)
elif isinstance(data, (list, tuple, set)):
for item in data:
xml += object_to_xml(item, 'item')
else:
xml += str(data)
xml += f'</{root}>'
return xml
示例:
xml = object_to_xml([1, 2, 3], 'root')
# <root><item>1</item><item>2</item><item>3</item></root>
xml = object_to_xml({"name": "the matrix", "age": 20, "metadata": {"dateWatched": datetime.datetime.now()}}, 'movie')
# <movie><name>the matrix</name><age>20</age><metadata><dateWatched>2020-11-01 00:35:39.020358</dateWatched></metadata></movie>