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中的is和==比较两个对象的两种方法
Sep 06 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
浅谈django的render函数的参数问题
Oct 16 Python
python中类的属性和方法介绍
Nov 27 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
TensorFLow 变量命名空间实例
Feb 11 Python
python将dict中的unicode打印成中文实例
May 11 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 Python
python实现层次聚类的方法
Nov 01 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 异常处理实现代码
2009/03/10 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
2013/04/11 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
英文自我鉴定
2013/12/10 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
代理人委托书
2014/09/16 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
博士导师推荐信
2015/03/25 职场文书
荒岛余生观后感
2015/06/09 职场文书
同学聚会感言一句话
2015/07/30 职场文书
学生病假条怎么写
2015/08/17 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python