使用Python + LXML如何批量修改XML中所有Weather_ID元素的取值
问题解决
原代码错误原因
- XPath定位逻辑错误:你写的
root.xpath("//Fx[./Weather_Id]")获取的是包含Weather_Id子节点的Fx父节点,并不是你要修改的Weather_Id节点本身,修改父节点的text属性自然不会改变子节点的取值 - 示例XML存在格式错误:第三个Fx节点有非法游离文本,写为
<Fx>3<Id>3</Id>,不符合XML规范,解析时会直接报错,实际使用前需要先修正这类格式问题 - 缺少结果输出逻辑:原代码修改后没有将内存中的XML结构输出或保存,无法验证修改是否生效
修正后完整代码
from lxml import etree # 修正了XML中的格式错误,去掉了第三个Fx节点开头多余的3 text = """\ <ProjectDataSet> <Fx> <Id>1</Id> <Weather_Id>2</Weather_Id> <Other></Other> </Fx> <Fx> <Id>2</Id> <Weather_Id>2</Weather_Id> <Other></Other> </Fx> <Fx> <Id>3</Id> <Weather_Id>2</Weather_Id> <Other></Other> </Fx> <Fx> <Id>4</Id> <Weather_Id>2</Weather_Id> <Other></Other> </Fx> </ProjectDataSet> """ # 解析XML,若从本地文件读取可以用 etree.parse("文件路径") root = etree.fromstring(text) newWeatherId = 5 # 直接匹配所有Weather_Id节点 targets = root.xpath("//Weather_Id") for node in targets: node.text = str(newWeatherId) # 输出修改后的XML,也可以直接写入本地文件 result = etree.tostring(root, encoding='UTF-8', xml_declaration=True, pretty_print=True) print(result.decode('UTF-8')) # 如果要保存到本地文件,去掉下行注释即可 # with open("修改后.xml", "wb") as f: # f.write(result)
补充说明
如果实际业务中的XML带有命名空间,需要在调用xpath方法时传入namespaces参数指定命名空间,否则会匹配不到节点。
内容的提问来源于stack exchange,提问作者anakaine
相关产品推荐
相关产品推荐

