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 pass 语句使用示例
Mar 11 Python
Python多线程和队列操作实例
Jun 21 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
解决在pycharm中显示额外的 figure 窗口问题
Jan 15 Python
Python手绘可视化工具cutecharts使用实例
Dec 05 Python
Python 支持向量机分类器的实现
Jan 15 Python
python3.x中安装web.py步骤方法
Jun 23 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
python爬虫快速响应服务器的做法
Nov 24 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 Python
Django+Celery实现定时任务的示例
Jun 23 Python
 Python 中 logging 模块使用详情
Mar 03 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
python实现的各种排序算法代码
2013/03/04 Python
python轻松实现代码编码格式转换
2015/03/26 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
物流经理自我评价
2013/09/23 职场文书
药学专业大专生的自我评价
2013/12/12 职场文书
全陪导游欢迎词
2014/01/17 职场文书
家长给孩子的表扬信
2014/01/17 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
2015年宣传工作总结
2015/04/08 职场文书
领导干部失职检讨书
2015/05/05 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL