用Python代码将XML转为JSON(或dict,字典)

1.下面的Python代码将任意XML格式文件转化为JSON格式(字典)。除Python自带的模块外,不需要依赖其他任何第三方库。

2.XML文件的读取使用Python自带的XML模块。

3.关键代码如下:

 1 import xml.etree.ElementTree as ET
 2 import json
 3 
 4 def xml2json(node):
 5     if not isinstance(node, ET.Element):
 6         raise Exception("node format error.")
 7 
 8     if len(node) == 0:
 9         return node.tag, node.text
10     
11     data = {}
12     temp = None
13     for child in node:
14         key, val = xml2json(child)
15         if key in data:
16             if type(data[key]) == list:
17                 data[key].append(val)
18             else:
19                 temp = data[key]
20                 data[key] = [temp, val]
21         else:
22             data[key] = val
23 
24     return node.tag, data

4.测试代码如下:

1 def main():
2     path = "./temp.xml"
3     tree = ET.parse(path)
4     node = tree.getroot()
5     tag, data = xml2json(node)
6     
7     f = open("./temp.json", "w", encoding="utf-8")
8     f.write(json.dumps(data, ensure_ascii=False, indent=4))
9     f.close()

5.结果如下:

(1)原XML文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <观测区域> 
 3     <坐标列表> 
 4         <坐标> 
 5             <经度>76.940</经度>  
 6             <纬度>-77.21</纬度> 
 7         </坐标>  
 8         <坐标> 
 9             <经度>81.7</经度>  
10             <纬度>-76.4</纬度> 
11         </坐标>  
12         <坐标> 
13             <经度>64</经度>  
14             <纬度>-66</纬度> 
15         </坐标>  
16         <坐标> 
17             <经度>63.5</经度>  
18             <纬度>-65.3</纬度> 
19         </坐标>  
20         <坐标> 
21             <经度>60.8</经度>  
22             <纬度>-66.4</纬度> 
23         </坐标>  
24         <坐标> 
25             <经度>60.2</经度>  
26             <纬度>-66.3</纬度> 
27         </坐标>  
28         <坐标> 
29             <经度>76.4</经度>  
30             <纬度>-77.2</纬度> 
31         </坐标> 
32     </坐标列表> 
33     <名称>普通观测</名称>
34 </观测区域> 

 

(2)转换后的JSON文件:

 1 {
 2     "坐标列表": {
 3         "坐标": [
 4             {
 5                 "经度": "76.940",
 6                 "纬度": "-77.21"
 7             },
 8             {
 9                 "经度": "81.7",
10                 "纬度": "-76.4"
11             },
12             {
13                 "经度": "64",
14                 "纬度": "-66"
15             },
16             {
17                 "经度": "63.5",
18                 "纬度": "-65.3"
19             },
20             {
21                 "经度": "60.8",
22                 "纬度": "-66.4"
23             },
24             {
25                 "经度": "60.2",
26                 "纬度": "-66.3"
27             },
28             {
29                 "经度": "76.4",
30                 "纬度": "-77.2"
31             }
32         ]
33     },
34     "名称": "普通观测"
35 }

 

posted @ 2022-12-09 10:48  奔_gis  阅读(3536)  评论(0编辑  收藏  举报