欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python实现xml转json文件的示例代码

程序员文章站 2022-03-23 20:39:31
使用了python的 xml.etree.elementtree 库xml.etree.elementtree 库简介xml.etree.elementtree模块实现了一个简单而高效的api用于解析...

使用了python的 xml.etree.elementtree 库

xml.etree.elementtree 库简介

xml.etree.elementtree模块实现了一个简单而高效的api用于解析和创建xml数据。xml.etree.elementtree模块对于恶意构造的数据是不安全的。如果您需要解析不受信任或未经验证的数据,请参阅xml漏洞。
参考文献:

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 xml json