无法通过条件循环正确提取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}")
代码说明
- 遍历ShareClass:先定位到每个
ShareClass节点,直接拿到它的Id属性,这是我们要配对的第一个值 - 精准查找AMFI Code:使用
find方法(而非findall)在当前ShareClass的子节点里找Type属性为AMFI Code的Code节点,这样只会拿到当前ShareClass对应的AMFI Code,不会混其他节点的 - 判断输出:如果当前ShareClass有AMFI Code,就按你想要的格式输出两者的配对
测试结果
运行这段代码后,输出完全符合你的预期:
112088,68016655 112087,68016656
内容的提问来源于stack exchange,提问作者sandeep007
相关产品推荐
相关产品推荐

