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 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
用Python编写web API的教程
Apr 30 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
python三大神器之fabric使用教程
Jun 10 Python
django-rest-framework 自定义swagger过程详解
Jul 18 Python
Python版中国省市经纬度
Feb 11 Python
pycharm通过anaconda安装pyqt5的教程
Mar 24 Python
Python中Cookies导出某站用户数据的方法
May 17 Python
Python 语言实现六大查找算法
Jun 30 Python
如何利用Python实现一个论文降重工具
Jul 09 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/10/09 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
jQuery的deferred对象使用详解
2011/08/20 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
vue发送ajax请求详解
2018/10/09 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
基于javascript实现放大镜特效
2020/12/03 Javascript
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
python版飞机大战代码分享
2018/11/20 Python
python实现简单坦克大战
2020/03/27 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
国际象棋商店:The Chess Store
2018/07/09 全球购物
环境科学专业大学生自荐信格式
2013/09/21 职场文书
建筑学推荐信
2013/11/03 职场文书
行政助理岗位职责范文
2013/12/03 职场文书
假面舞会策划方案
2014/05/29 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2014年教师工作总结
2014/11/10 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
春季运动会开幕词
2015/01/28 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS