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 itertools模块详解
May 09 Python
在Django中创建动态视图的教程
Jul 15 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
python实现超简单的视频对象提取功能
Jun 04 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
python树莓派红外反射传感器
Jan 21 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
Python Socket多线程并发原理及实现
Dec 11 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中文字符串截取方法实例总结
2014/09/30 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
微信自定义分享php代码分析
2016/11/24 PHP
PHP与以太坊交互详解
2018/08/24 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
jquery 3D球状导航的文章分类
2010/07/06 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
用Angular实时获取本地Localstorage数据,实现一个模拟后台数据登入的效果
2016/11/09 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
python解析模块(ConfigParser)使用方法
2013/12/10 Python
python中使用urllib2伪造HTTP报头的2个方法
2014/07/07 Python
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
YUV转为jpg图像的实现
2019/12/09 Python
django rest framework使用django-filter用法
2020/07/15 Python
如何利用python生成MD5并去重
2020/12/07 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
初婚未育证明
2014/01/15 职场文书
四年大学生活的自我评价范文
2014/02/07 职场文书
文化活动实施方案
2014/03/28 职场文书
委托书样本
2014/04/02 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL