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实现html转ubb代码(html2ubb)
Jul 03 Python
python发送邮件实例分享
Jul 28 Python
新手常见6种的python报错及解决方法
Mar 09 Python
Python3之不使用第三方变量,实现交换两个变量的值
Jun 26 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
Python数据可视化图实现过程详解
Jun 12 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 Python
浅谈pytorch中的dropout的概率p
May 27 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
Python pyecharts绘制条形图详解
Apr 02 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/09/30 PHP
PHP可变函数的使用详解
2013/06/14 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
玩转Koa之核心原理分析
2018/12/29 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
详解Python中的__new__()方法的使用
2015/04/09 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
如何在django中添加日志功能
2020/02/06 Python
python实现贪吃蛇双人大战
2020/04/18 Python
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
医科学校毕业生自荐信
2013/11/09 职场文书
网络教育自我鉴定
2014/02/04 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
红色影片观后感
2015/06/18 职场文书
公司职员入党自传书
2015/06/26 职场文书
银行求职信怎么写
2019/06/20 职场文书
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android
vue组件vue-esign实现电子签名
2022/04/21 Vue.js
Golang map映射的用法
2022/04/22 Golang
Java界面编程实现界面跳转
2022/06/16 Java/Android