如何在Dart中为嵌套XML生成父子节点UUID关联分支列表?
问题
给定如下XML结构:
<?xml version="1.0" encoding="utf-8"?> <root uuid="{c6ede94d-c675-48ec-8a81-2080c6ea5725}"><title>Root</title> <folder uuid="{eae91fe9-469c-4743-9ab8-10cd65676c9b}"><title>Lv1</title> <folder uuid="{b495b5ab-e0cc-4a80-af80-f6fc6e9c902e}"><title>Lv2</title> </folder> <folder uuid="{df8ffcaf-e9ce-4632-a928-b930e3edd586}"><title>Lv2</title> </folder> </folder> <folder uuid="{2c0c0cd6-fb47-4dcd-973b-3af07eee7e7b}"><title>Lv1</title> <folder uuid="{d5518b4e-5f27-487d-bda9-36115e101cc9}"><title>Lv2</title> </folder> <folder uuid="{8f30601d-d3e7-42fc-a0ce-034d75124c33}"><title>Lv2</title> </folder> </folder> </root>
需要生成父子节点UUID的关联分支列表,格式如下:
branches = { "branch": [ { "Root": "{c6ede94d-c675-48ec-8a81-2080c6ea5725}", "Lv1": "{eae91fe9-469c-4743-9ab8-10cd65676c9b}" }, { "Root": "{c6ede94d-c675-48ec-8a81-2080c6ea5725}", "Lv1": "{2c0c0cd6-fb47-4dcd-973b-3af07eee7e7b}" }, { "Lv1": "{eae91fe9-469c-4743-9ab8-10cd65676c9b}", "Lv2": "{b495b5ab-e0cc-4a80-af80-f6fc6e9c902e}" }, { "Lv1": "{eae91fe9-469c-4743-9ab8-10cd65676c9b}", "Lv2": "{df8ffcaf-e9ce-4632-a928-b930e3edd586}" }, { "Lv1": "{2c0c0cd6-fb47-4dcd-973b-3af07eee7e7b}", "Lv2": "{d5518b4e-5f27-487d-bda9-36115e101cc9}" }, { "Lv1": "{2c0c0cd6-fb47-4dcd-973b-3af07eee7e7b}", "Lv2": "{8f30601d-d3e7-42fc-a0ce-034d75124c33}" } ] }
也就是要建立Root与Lv1、Lv1与Lv2之间的UUID关联分支。目前尝试用XPath获取Root和一级folder的UUID,但无法获取Lv2的UUID,求解决方案。
解决方案
1. 用XPath分两类提取父子关联
可以通过两组XPath表达式,分别获取不同层级的UUID对:
- 提取Root与Lv1的关联:
使用XPath表达式/root/folder,对每个匹配的节点,取父节点(root)的uuid属性,以及当前节点的uuid属性,对应标题为Root和Lv1。 - 提取Lv1与Lv2的关联:
使用XPath表达式/root/folder/folder,对每个匹配的节点,取父节点(一级folder)的uuid属性,以及当前节点的uuid属性,对应标题为Lv1和Lv2。
2. 代码实现示例(以Python的lxml库为例)
from lxml import etree import json # 解析XML内容 xml_content = """<?xml version="1.0" encoding="utf-8"?> <root uuid="{c6ede94d-c675-48ec-8a81-2080c6ea5725}"><title>Root</title> <folder uuid="{eae91fe9-469c-4743-9ab8-10cd65676c9b}"><title>Lv1</title> <folder uuid="{b495b5ab-e0cc-4a80-af80-f6fc6e9c902e}"><title>Lv2</title> </folder> <folder uuid="{df8ffcaf-e9ce-4632-a928-b930e3edd586}"><title>Lv2</title> </folder> </folder> <folder uuid="{2c0c0cd6-fb47-4dcd-973b-3af07eee7e7b}"><title>Lv1</title> <folder uuid="{d5518b4e-5f27-487d-bda9-36115e101cc9}"><title>Lv2</title> </folder> <folder uuid="{8f30601d-d3e7-42fc-a0ce-034d75124c33}"><title>Lv2</title> </folder> </folder> </root>""" tree = etree.fromstring(xml_content) branches = [] # 生成Root-Lv1的关联分支 root_uuid = tree.get("uuid") lv1_folders = tree.xpath("/root/folder") for folder in lv1_folders: branches.append({ "Root": root_uuid, "Lv1": folder.get("uuid") }) # 生成Lv1-Lv2的关联分支 lv2_folders = tree.xpath("/root/folder/folder") for folder in lv2_folders: parent_uuid = folder.getparent().get("uuid") branches.append({ "Lv1": parent_uuid, "Lv2": folder.get("uuid") }) # 输出目标格式的结果 result = {"branch": branches} print(json.dumps(result, indent=2))
运行这段代码后,即可得到符合要求的父子UUID关联分支列表。
内容的提问来源于stack exchange,提问作者bangdt
相关产品推荐
相关产品推荐

