无法按条件提取XML指定节点及对应账户,请求修正Python代码
提取XML中RNAME为Applicable的节点及对应账户信息
需求说明
需要从XML中提取RNAME值为Applicable的<Report>节点,以及该节点下对应的账户信息,最终整理成指定格式的DataFrame。
XML示例
<Reports> <Report> <ID>A1234</ID> <RNAME>Not Applicable</RNAME> <Accounts> <Account> <AID>12345</AID> <A2>TEST1</A2> </Account> </Accounts> </Report> <Report> <ID>A12345</ID> <RNAME>Applicable</RNAME> <Accounts> <Account> <AID>123456789</AID> <A2>TEST2</A2> </Account> </Accounts> </Report> </Reports>
预期DataFrame输出
| ID | AID | A2 |
|---|---|---|
| A12345 | 123456789 | TEST2 |
现有代码问题
当前代码能正确识别目标<Report>节点并输出对应ID,但会全局遍历所有账户节点,导致输出全部账户数据,无法关联到目标节点下的账户:
for x in ET.fromstring(sample.xml).findall(".//Report"): RNAME = x.find("RNAME").text if RNAME != "Not Applicable": ID = x.find("ID").text print(ID) # 输出A12345 for y in ET.fromstring(content).findall('.//Report/Accounts/Account'): AID = y.find("AID").text A2 = y.find("A2").text print(AID, A2) # 输出所有账户:12345 TEST1 和 123456789 TEST2
修正后的代码
import xml.etree.ElementTree as ET import pandas as pd # 若XML来自文件,可替换为root = ET.parse("你的文件路径.xml").getroot() root = ET.fromstring(sample_xml) result_data = [] for report_node in root.findall(".//Report"): rname_text = report_node.find("RNAME").text if rname_text == "Applicable": current_id = report_node.find("ID").text # 仅在当前匹配的Report节点下查找账户,而非全局查找 account_nodes = report_node.findall(".//Accounts/Account") for account in account_nodes: aid = account.find("AID").text a2 = account.find("A2").text result_data.append({"ID": current_id, "AID": aid, "A2": a2}) # 转换为目标格式的DataFrame df = pd.DataFrame(result_data) print(df)
代码说明
- 节点关联查找:不再全局遍历所有
<Account>节点,而是在匹配到RNAME=Applicable的<Report>节点内部进行账户查找,确保账户数据和所属Report节点一一对应。 - 数据整理:通过列表收集符合条件的字典数据,最后转换为DataFrame,直接得到预期格式的输出。
内容的提问来源于stack exchange,提问作者NK1
相关产品推荐
相关产品推荐

