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中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
django解决跨域请求的问题
Nov 11 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Puppeteer使用示例详解
Jun 20 Python
python生成器用法实例详解
Nov 22 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
简单了解Python多态与属性运行原理
Jun 15 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
python如何写个俄罗斯方块
Nov 06 Python
python源码剖析之PyObject详解
May 18 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
第四章 php数学运算
2011/12/30 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
javascript下过滤数组重复值的代码
2007/09/10 Javascript
jQuery 使用手册(六)
2009/09/23 Javascript
jquery动态添加option示例
2013/12/30 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
javascript中href和replace的比较(详解)
2016/11/25 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue-star评星组件开发实例
2018/03/01 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python中cPickle类使用方法详解
2018/08/27 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
AJAX都有哪些有点和缺点
2012/11/03 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
开展创先争优活动总结
2014/08/28 职场文书
感恩教师主题班会
2015/08/12 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书