如何在lxml中修改XML文件object节点下name标签的文本值
问题原因
你当前代码的错误在于直接修改了<object>节点本身的文本属性,并没有定位到<object>下嵌套的<name>子节点,所以新文本会被插入到<object>标签起始位置和它的第一个子标签之间,原有<name>标签的内容完全没有被改动。
修正后的代码
def _rename_objects(tree, path, new_name="new_name"): root = tree.getroot() # 遍历所有object节点 for obj in root.iter('object'): # 查找当前object节点下的name子节点 name_node = obj.find('name') # 确认name节点存在再修改,避免无name节点的情况报错 if name_node is not None: name_node.text = str(new_name) # 写入时指定编码避免乱码 tree.write(path, encoding='utf-8', xml_declaration=True)
调试小技巧
如果需要打印XML节点内容排查问题,可以用tostring方法把节点转成可读字符串:
# 标准xml.etree库写法 import xml.etree.ElementTree as ET print(ET.tostring(obj, encoding='unicode')) # lxml库写法 from lxml import etree print(etree.tostring(obj, encoding='unicode', pretty_print=True))
内容的提问来源于stack exchange,提问作者Jürgen K.
相关产品推荐
相关产品推荐

