python xml转json_Python3实现xml转json文件

from xml.etree importElementTreeimportjson

LISTTYPE= 1DICTTYPE=0defgetDictResults(res_dicts, iters):

result_dicts={}for iter initers.getchildren():

iterxml(iter, result_dicts)ifresult_dicts:

res_dicts[iters.tag].update(result_dicts)defgetListResults(res_dicts, iters):

result_lists=[]for iter initers.getchildren():

result_dicts={}

iterxml(iter, result_dicts)

result_lists.append(result_dicts.copy())del(result_dicts)ifresult_lists:if len(res_dicts[iters.tag].items()) ==0:

res_dicts[iters.tag]=result_lists.copy()else:for resobj inresult_lists:

resobjkey=list(resobj.keys())[0]if res_dicts[iters.tag].get(resobjkey) ==None:

res_dicts[iters.tag].update(resobj)else:if type(res_dicts[iters.tag][resobjkey]) ==list:

res_dicts[iters.tag][resobjkey].append(resobj[resobjkey].copy())else:

old_value=res_dicts[iters.tag][resobjkey]

res_dicts[iters.tag][resobjkey]=[]

res_dicts[iters.tag][resobjkey].append(old_value)

res_dicts[iters.tag][resobjkey].append(resobj[resobjkey].copy())del(result_lists)defcheckxmlchildrentype(iters):

taglist=[]for iter initers.getchildren():

taglist.append(iter.tag)if len(set(taglist)) ==len(taglist):returnDICTTYPEelse:returnLISTTYPEdefgetResults(res_dicts, iters):ifcheckxmlchildrentype(iters):returngetListResults(res_dicts, iters)else:returngetDictResults(res_dicts, iters)#@res_dicts {}

defiterxml(iter, res_dicts):

res_dicts[iter.tag]={}ifiter.attrib:for k,v indict(iter.attrib).items():

res_dicts[iter.tag].update({k : v})if iter.text is not None and iter.text.strip() != "":

res_dicts[iter.tag].update({"__XmlTagText__": iter.text.strip()})ifiter.getchildren():

getResults(res_dicts, iter)defparserxmltojson(file_path):try:

tree=ElementTree.parse(file_path)exceptException as e:#multi-byte encodings are not supported 把字符集改成utf-8就可以

#encoding specified in XML declaration is incorrect xml encoding标识和文件的字符集不同

#syntax error 语法错误,乱码等

#not well-formed (invalid token) 编辑器点击后字符集被修改成ASCII等,或者文件本身字符集和xml encoding不相同

print("Parser {} Error, Errmsg: {}".format(file_path, e))return ""

if tree isNone:print("{} is None.".format(file_path))return ""root=tree.getroot()

report={}

iterxml(root, report)#return getDictResults(root)

returnreportif __name__ == "__main__":

jsonret= parserxmltojson("test.xml")

with open("test.json", "w", encoding="utf-8") as fd:

fd.write(json.dumps(jsonret, ensure_ascii=False, indent=4))print(json.dumps(jsonret, ensure_ascii=False, indent=4))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值