修改XML后保存报错:ValueError: Series的真值判断模糊
问题分析与解决方案
错误根源
你遇到的ValueError是因为price_new和per_new是pandas Series对象,而非单个标量值。当你把Series直接赋值给XML元素的text属性时,内部逻辑会尝试判断该Series的布尔值,而Series的布尔值判断本身是歧义的(无法确定是判断所有元素还是任意元素),因此触发错误。
另外代码还存在两个逻辑漏洞:
- 遍历顺序问题:可能在未获取到
line_number_value时就执行赋值操作,导致使用错误的变量值 for i in range(1)完全多余,只会让外层循环执行一次,没有实际作用
修复步骤
- 从Series中提取标量值:使用
.iloc[0]获取匹配到的第一个值,同时添加判断避免无匹配时的索引错误 - 修正遍历逻辑:先收集当前条目LineNumber对应的价格数据,再统一修改对应价格节点,避免遍历顺序导致的变量未定义问题
- 转成字符串类型:XML元素的
text必须是字符串,所以要把数值类型的价格转成字符串
修改后的代码
import xml.etree.ElementTree as ET import pandas as pd # 加载XML文件 tree = ET.parse(r'C:\Users\barbsmor\ArticleData_0200_20210707.xml') root = tree.getroot() # 加载Excel数据 df = pd.read_excel(r'C:\Users\data_new_all.xlsx', engine='openpyxl') # 遍历XML节点,先收集LineNumber对应数据,再修改价格节点 for child in root: for child1 in child: line_number_value = None price_new = None per_new = None # 第一步:获取当前条目LineNumber及对应价格数据 for child2 in child1: if child2.tag == 'LineNumber': line_number_value = child2.text.strip() # 查找匹配行,提取标量值 match_row = df[df['line'] == line_number_value] if not match_row.empty: price_new = str(match_row['new_price'].iloc[0]) per_new = str(match_row['new_per'].iloc[0]) # 第二步:修改当前条目下的价格节点 for child2 in child1: for child3 in child2: if child3.tag == 'GrossPrice' and price_new is not None: child3.text = price_new for child4 in child3: if child4.tag == 'NumberOfUnitsInPriceBasis' and per_new is not None: child4.text = per_new # 保存修改后的XML,指定编码避免乱码 tree.write(r'C:\Users\test.xml', encoding='utf-8', xml_declaration=True)
关键说明
- 使用
match_row.empty判断是否找到匹配数据,避免无匹配时调用.iloc[0]触发索引错误 - 把数值转成字符串
str(),确保符合XML文本节点的格式要求 - 拆分遍历逻辑,先收集数据再修改节点,解决了原代码中遍历顺序导致的变量未定义问题
- 添加
encoding='utf-8', xml_declaration=True,保证导出的XML编码正确,避免乱码
内容的提问来源于stack exchange,提问作者HeadOverFeet
相关产品推荐
相关产品推荐

