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

作者:撒欢 时间:2023-09-29 23:52:50 

使用了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))

来源:https://www.cnblogs.com/frisk/p/12634427.html

标签:python,xml,json
0
投稿

猜你喜欢

  • Python中如何自定义函数

    2021-12-12 20:20:58
  • python requests.post带head和body的实例

    2022-07-12 01:22:59
  • ThinkPHP3.1.2 使用cli命令行模式运行的方法

    2023-11-14 12:56:27
  • javascript 通用滑动门tab类

    2023-08-05 09:42:25
  • python mysql自增字段AUTO_INCREMENT值的修改方式

    2023-10-15 07:12:19
  • Django中redis的使用方法(包括安装、配置、启动)

    2022-03-09 02:15:59
  • Dreamweaver使用中的7个常见问题与解答

    2007-11-03 11:34:00
  • Python+OpenCV进行人脸面部表情识别

    2021-07-18 22:47:35
  • Python实现多张图片合成一张马赛克图片

    2022-02-15 21:09:46
  • Python中time与datetime模块使用方法详解

    2022-11-06 11:03:59
  • ASP与MySQL的连接[图文教程]

    2010-03-14 11:21:00
  • python爬虫 爬取超清壁纸代码实例

    2021-03-19 02:51:54
  • python实现两个一维列表合并成一个二维列表

    2023-08-06 12:59:44
  • python脚本监控Tomcat服务器的方法

    2023-10-03 18:19:23
  • Python实现一维插值方法的示例代码

    2022-04-14 02:49:10
  • Go语言框架快速集成限流中间件详解

    2023-08-26 11:44:39
  • 戴着锁链跳舞

    2009-08-20 13:06:00
  • Python利用逻辑回归分类实现模板

    2023-11-14 07:02:05
  • python Django里CSRF 对应策略详解

    2021-02-15 20:36:19
  • Django调用百度AI接口实现人脸注册登录代码实例

    2023-10-13 23:07:14
  • asp之家 网络编程 m.aspxhome.com