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的三目运算符和not in运算符使用示例
Mar 03 Python
python分布式环境下的限流器的示例
Oct 26 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
使用Python设计一个代码统计工具
Apr 04 Python
python3爬虫怎样构建请求header
Dec 23 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
python实现列表中最大最小值输出的示例
Jul 09 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
pandas的resample重采样的使用
Apr 24 Python
python求解汉诺塔游戏
Jul 09 Python
scrapy处理python爬虫调度详解
Nov 23 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 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 开发工具
2006/12/06 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
2015/05/12 PHP
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
修改NPM全局模式的默认安装路径的方法
2020/12/15 Javascript
python海龟绘图实例教程
2014/07/24 Python
python进阶教程之文本文件的读取和写入
2014/08/29 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
以一段代码为实例快速入门Python2.7
2015/03/31 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
python实现爬取图书封面
2018/07/05 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Python的高阶函数用法实例分析
2019/04/11 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
python制作微博图片爬取工具
2021/01/16 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
程序设计HTML5 Canvas API
2013/04/08 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
大学生毕业求职自荐书范文
2014/02/04 职场文书
五一活动标语
2014/06/30 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
小学生优秀评语
2014/12/29 职场文书
2015中学教学工作总结
2015/07/22 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
python中os.path.join()函数实例用法
2021/05/26 Python