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

无法通过条件循环正确提取XML元素问题求助

问题分析与修复方案

首先明确:这是你的循环逻辑错误,不是XML特性导致的,咱们来一步步拆解问题:

为什么当前代码输出不符合预期?

你现在的代码逻辑是:

  • 先把所有AMFI Code找出来逐个输出
  • 每输出一个AMFI Code,就把所有ShareClass的Id全输出一遍
    这就导致了每个AMFI Code都会跟所有ShareClass Id配对,完全不是你想要的“一一对应”关系。另外你外层那个for child in root:循环根本没用到child变量,属于多余的代码,还可能让整个逻辑重复执行。

正确的实现思路

咱们应该换个顺序:先遍历每个ShareClass,再在这个ShareClass内部找对应的AMFI Code,这样就能保证ShareClass Id和AMFI Code是绑定在一起的。

修正后的代码如下:

import xml.etree.ElementTree as ET

def get_namespace(root):
    return root.tag.split('}')[0].strip('{')

tree = ET.parse('test.xml')
namespace = get_namespace(tree.getroot())
root = tree.getroot()

# 先遍历每一个ShareClass
for share_class in root.findall("./{0}AssetOverview/{0}ShareClasses/{0}ShareClass".format(namespace)):
    # 获取当前ShareClass的Id
    class_id = share_class.attrib['Id']
    # 在当前ShareClass下精准查找AMFI Code(用find而不是findall,只找第一个匹配的)
    amfi_code = share_class.find("./{0}Profile/{0}CrossReferenceCodes/{0}Code[@Type='AMFI Code']".format(namespace))
    # 如果找到AMFI Code,就按格式输出
    if amfi_code is not None:
        print(f"{amfi_code.text},{class_id}")

代码说明

  1. 遍历ShareClass:先定位到每个ShareClass节点,直接拿到它的Id属性,这是我们要配对的第一个值
  2. 精准查找AMFI Code:使用find方法(而非findall)在当前ShareClass的子节点里找Type属性为AMFI Code的Code节点,这样只会拿到当前ShareClass对应的AMFI Code,不会混其他节点的
  3. 判断输出:如果当前ShareClass有AMFI Code,就按你想要的格式输出两者的配对

测试结果

运行这段代码后,输出完全符合你的预期:

112088,68016655
112087,68016656

内容的提问来源于stack exchange,提问作者sandeep007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:13:54