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 相关文章推荐
Centos Python2 升级到Python3的简单实现
Jun 21 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
django模板语法学习之include示例详解
Dec 17 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
Matplotlib中文乱码的3种解决方案
Nov 15 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
Django之全局使用request.user.username的实例详解
May 14 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
Jun 08 Python
浅析python实现动态规划背包问题
Dec 31 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
PDO::commit讲解
2019/01/27 PHP
js停止输出代码
2008/07/20 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
JSON取值前判断
2014/12/23 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python 专题四 文件基础知识
2017/03/20 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python中for用来遍历range函数的方法
2018/06/08 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
python 模块导入问题汇总
2021/02/01 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
机械电子工程毕业生自荐信
2013/11/23 职场文书
运动会广播稿500字
2014/01/28 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
护理医院见习报告
2014/11/03 职场文书
2015年公司新年寄语
2014/12/08 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android