场景
工作中想写一个工具时,其中一部分功能是需要将xml信息转成json格式的,方便后面处理。使用ET和DOM去解析也是可以的,但是本人编程又没有开发的熟练,发现大多数时间大多数时间都浪费在解析xml上。直到发现xmltodict这个第三方模块。将xml转换成字典(dict)或者json之后方便了许多。
xml格式
在传输数据的时候,大多使用xml封装消息内容,所以很少有tag的属性值。下面举例的xml格式的消息是没有属性值的,但是xmltodict也是支持带属性值的。
<school>
<teachers>
<teacher>
<name>Alice</name>
<course>Maths</course>
</teacher>
<teacher>
<name>Bob</name>
<course>PE</course>
</teacher>
</teachers>
<students>
<student>
<name>张三</name>
<sex>男</sex>
<age>19</age>
</student>
<student>
<name>李四</name>
<sex>女</sex>
<age>29</age>
</student>
</students>
</school>
安装xmltodict模块
本人是直接使用pip命令安装的
pip install xmltodict
Collecting xmltodict
Downloading https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl
Installing collected packages: xmltodict
Successfully installed xmltodict-0.12.0
xml转dict
直接看代码
# coding:utf-8
'''
python3
test xmltodict module
'''
import xmltodict
import json
xml_str = '''<school>
<teachers>
<teacher>
<name>Alice</name>
<course>Maths</course>
</teacher>
<teacher>
<name>Bob</name>
<course>PE</course>
</teacher>
</teachers>
<students>
<student>
<name>张三</name>
<sex>男</sex>
<age>19</age>
</student>
<student>
<name>李四</name>
<sex>女</sex>
<age>29</age>
</student>
</students>
</school>'''
new_dict_obj = xmltodict.parse(xml_str) # 返回一个OrderedDict类型的对象
json_str = json.dumps(new_dict_obj) # 使用内置的json模块转换成json
print(new_dict_obj)
print(json_str)
打印结果(就放json字符串了)
{
"school": {
"teachers": {
"teacher": [{
"name": "Alice",
"course": "Maths"
}, {
"name": "Bob",
"course": "PE"
}]
},
"students": {
"student": [{
"name": "\u5f20\u4e09",
"sex": "\u7537",
"age": "19"
}, {
"name": "\u674e\u56db",
"sex": "\u5973",
"age": "29"
}]
}
}
}
json转成xml
代码
# 直接接上面的代码了
new_xml_str = xmltodict.unparse(new_dict_obj)# 这里直接放dict对象,不要放json字符串
print(new_xml_str)
打印结果(上面多了一行文档声明)
<?xml version="1.0" encoding="utf-8"?>
<school>
<teachers>
<teacher>
<name>Alice</name>
<course>Maths</course>
</teacher>
<teacher>
<name>Bob</name>
<course>PE</course>
</teacher>
</teachers>
<students>
<student>
<name>张三</name>
<sex>男</sex>
<age>19</age>
</student>
<student>
<name>李四</name>
<sex>女</sex>
<age>29</age>
</student>
</students>
</school>
如何读取xml文件,输出json字符串
xml文件我直接用上面的,保存成 test.xml
f = open('test.xml', mode='r', encoding='utf-8') # encoding要加上
new_dict_obj = xmltodict.parse(f.read())
效果跟上文是一样的,就不在贴打印内容了
后记
例子自己随手写的有点孬,能够演示就可以了,基本用法就这样了,能够解决目前问题。随笔以记之......
网友评论