如何用Python 3.4的ElementTree获取并更新XML中的Phone值
如何用Python 3.4的ElementTree更新XML中的Phone字段值?
嘿,我来帮你搞定这个问题!你已经有了解析XML的基础代码,现在只需要针对Phone字段做定位、取值和更新这几步就行,具体操作如下:
首先先回顾下你的XML结构:
return (<Details> <Attrib name="Name">bill</Attrib> <Attrib name="Email">bill.jones@mail.com</Attrib> <Attrib name="Phone">555-000-555</Attrib> </Details> )
你之前的代码只打印了节点的标签和属性,但没访问到节点的文本内容(也就是Phone字段的实际值)——这个内容存在节点的text属性里。接下来分两种方式实现需求:
方式一:和现有代码风格一致的循环遍历
这种方式和你当前的遍历逻辑保持统一,不需要额外学习新语法:
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() # 遍历所有子节点,找到name属性为"Phone"的Attrib节点 for child in root: # 检查当前节点的name属性是否是Phone if child.attrib.get('name') == 'Phone': # 获取当前Phone字段的值 current_phone = child.text print(f"当前Phone值:{current_phone}") # 更新为你需要的新值 child.text = "555-123-456" print(f"更新后的Phone值:{child.text}") # 非常重要:把修改后的内容写回原文件(或者指定新文件路径) tree.write('file.xml')
方式二:用XPath快速定位节点(更简洁)
Python 3.4的ElementTree已经支持基础的XPath语法,能直接定位到目标节点,省去循环的麻烦:
import xml.etree.ElementTree as ET tree = ET.parse('file.xml') root = tree.getroot() # 用XPath查找name属性为"Phone"的Attrib节点 phone_node = root.find(".//Attrib[@name='Phone']") if phone_node is not None: # 获取当前值 current_phone = phone_node.text print(f"当前Phone值:{current_phone}") # 更新值 phone_node.text = "555-789-012" # 保存修改 tree.write('file.xml') else: print("未找到name为Phone的字段,请检查XML结构")
关键注意点
- 节点的实际值存在
text属性中,这是你之前代码没触及的部分 - 修改完成后必须调用
tree.write(),否则所有修改只存在于内存中,不会保存到磁盘文件 - 如果要避免覆盖原文件,可以给
tree.write()传入新的文件名,比如tree.write('updated_file.xml')
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

