You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:21:07