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编程判断这天是这一年第几天的方法示例
Apr 18 Python
Python实现随机选择元素功能
Sep 14 Python
Python机器学习logistic回归代码解析
Jan 17 Python
3分钟学会一个Python小技巧
Nov 23 Python
详解python和matlab的优势与区别
Jun 28 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
Django返回HTML文件的实现方法
Sep 17 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 Python
python套接字socket通信
Apr 01 Python
Python如何使用循环结构和分支结构
Apr 13 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日历[测试通过]
2008/03/27 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
js省市区级联查询(插件版&无插件版)
2017/03/21 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
react native与webview通信的示例代码
2017/09/25 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
python求crc32值的方法
2014/10/05 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
python如何修改装饰器中参数
2018/03/20 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
flask开启多线程的具体方法
2020/08/02 Python
学期自我鉴定
2013/11/04 职场文书
大学生就业推荐信范文
2013/11/29 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
文化宣传方案
2014/03/13 职场文书
单位活动策划方案
2014/08/17 职场文书
亲属关系公证书样本
2015/01/23 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技