如何将指定XML文件按顺序解析为Item结构数组?
解决XML转指定JSON结构的问题
嘿,这个需求很明确,就是要把嵌套的XML转成每个Item包含prop属性和按顺序排列的key列表的JSON数组对吧?我用Python给你实现,代码简单易懂,还能完美处理多层嵌套的A/B/C标签。
首先得提一句:你的原XML标签没有闭合,解析时会报错,所以我先补全了闭合标签(实际处理本地文件的话,只要文件格式合法就没问题)。下面是完整的实现代码:
import xml.etree.ElementTree as ET import json # 替换成你的XML内容,或者后续改成读取本地文件 xml_content = ''' <Root> <Item prop="foo"> <A key="1"> <B key="2"> <A key="3"> <C key="4"> <A key="5"> <A key="6"> </A> </A> </C> </A> </B> </A> </Item> <Item prop="bar"> <B key="7"> <C key="8"> </C> </B> </Item> </Root> ''' # 解析XML内容 root = ET.fromstring(xml_content) result = [] # 遍历每个<Item>节点 for item_node in root.findall('Item'): item_info = { "prop": item_node.get('prop'), "list": [] } # 递归遍历所有子节点,收集A/B/C的key属性 def collect_keys(node): # 检查当前节点是否是目标标签 if node.tag in ('A', 'B', 'C'): key_val = node.get('key') if key_val: item_info['list'].append({"key": key_val}) # 继续遍历子节点,保证顺序和XML里的出现顺序一致 for child in node: collect_keys(child) # 从Item的直接子节点开始递归遍历 for child in item_node: collect_keys(child) result.append(item_info) # 输出格式化后的JSON结果 print(json.dumps(result, indent=2))
代码说明:
- XML解析:用Python内置的
xml.etree.ElementTree模块,不需要额外安装依赖,轻量高效。 - 递归收集key:通过递归函数
collect_keys深度优先遍历所有子节点,不管嵌套多少层,只要是A/B/C标签就提取key属性,并且严格按照XML里的顺序添加到list数组中。 - 生成JSON:最后把整理好的列表转成带缩进的JSON字符串,完全匹配你想要的结构。
如果你的XML是保存在本地文件里的,只需要把ET.fromstring(xml_content)改成ET.parse('你的文件名.xml').getroot()即可。
运行这段代码后,输出结果如下:
[ { "prop": "foo", "list": [ { "key": "1" }, { "key": "2" }, { "key": "3" }, { "key": "4" }, { "key": "5" }, { "key": "6" } ] }, { "prop": "bar", "list": [ { "key": "7" }, { "key": "8" } ] } ]
内容的提问来源于stack exchange,提问作者Fela Maslen
相关产品推荐
相关产品推荐

