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操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
Python缩进和冒号详解
Jun 01 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
关于python多重赋值的小问题
Apr 17 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
python模块如何查看
Jun 16 Python
Python headers请求头如何实现快速添加
Nov 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
php中一个有意思的日期逻辑处理
2012/03/25 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
python字典DICT类型合并详解
2017/08/17 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Django 外键的使用方法详解
2019/07/19 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
内衣营销方案
2014/03/15 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
医师定期考核实施方案
2014/05/07 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
个人党性分析材料
2014/12/19 职场文书
学前班学生评语
2014/12/29 职场文书
死亡赔偿协议书
2015/01/28 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
OpenCV实现反阈值二值化
2021/11/17 Java/Android
win10清理dns缓存
2022/04/19 数码科技