python实现xml转json文件的示例代码


Posted in Python onDecember 30, 2020

使用了Python的 xml.etree.ElementTree 库

xml.etree.ElementTree 库简介

xml.etree.ElementTree模块实现了一个简单而高效的API用于解析和创建XML数据。xml.etree.ElementTree模块对于恶意构造的数据是不安全的。如果您需要解析不受信任或未经验证的数据,请参阅XML漏洞。
参考文献:https://docs.python.org/3.6/library/xml.etree.elementtree.html

from xml.etree import ElementTree
import json

LISTTYPE = 1
DICTTYPE = 0

def getDictResults(res_dicts, iters):
  result_dicts = {}
  for iter in iters.getchildren():
    iterxml(iter, result_dicts)

  if result_dicts:
    res_dicts[iters.tag].update(result_dicts)

def getListResults(res_dicts, iters):
  result_lists = []
  for iter in iters.getchildren():
    result_dicts = {}
    iterxml(iter, result_dicts)
    result_lists.append(result_dicts.copy())
    del(result_dicts)
  
  if result_lists:
    if len(res_dicts[iters.tag].items()) == 0:
      res_dicts[iters.tag] = result_lists.copy()
    else:
      for resobj in result_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)

def checkxmlchildrentype(iters):
  taglist = []
  for iter in iters.getchildren():
    taglist.append(iter.tag)

  if len(set(taglist)) == len(taglist):
    return DICTTYPE
  else:
    return LISTTYPE

def getResults(res_dicts, iters):
  if checkxmlchildrentype(iters):
    return getListResults(res_dicts, iters)
  else:
    return getDictResults(res_dicts, iters)

#@res_dicts  {}
def iterxml(iter, res_dicts):
  res_dicts[iter.tag] = {}

  if iter.attrib:
    for k,v in dict(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()})
  
  if iter.getchildren():
    getResults(res_dicts, iter)

def parserxmltojson(file_path):
  try:
    tree = ElementTree.parse(file_path)
  except Exception 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 is None:
    print("{} is None.".format(file_path))
    return ""

  root = tree.getroot()

  report = {}
  iterxml(root, report)
  #return getDictResults(root)

  return report

if __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))

以上就是python实现xml转json文件的示例代码的详细内容,更多关于python实现xml转json文件的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python yield使用方法示例
Dec 04 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Python实现购物车程序
Apr 16 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
python数值基础知识浅析
Nov 19 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
分享Python异步爬取知乎热榜
Apr 12 Python
python实现KNN近邻算法
Dec 30 #Python
python 实现逻辑回归
Dec 30 #Python
Python 随机按键模拟2小时
Dec 30 #Python
Python的scikit-image模块实例讲解
Dec 30 #Python
用Python实现职工信息管理系统
Dec 30 #Python
python实现双人五子棋(终端版)
Dec 30 #Python
pandas 数据类型转换的实现
Dec 29 #Python
You might like
PHP Filter过滤器全面解析
2016/08/09 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
成功的餐厅经营创业计划书
2014/01/15 职场文书
公司业务员岗位职责
2014/03/18 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
活动总结格式
2014/08/30 职场文书
租房协议书
2014/09/12 职场文书
企业务虚会发言材料
2014/10/20 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js