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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:18:03