使用Python的xml.etree.ElementTree提取XML中address元素失败求助
问题根源:XML默认命名空间导致元素查找失败
你遇到的问题核心在于XML文档存在默认命名空间——也就是<esc>标签里的xmlns="http://www.test.com/esc/esc"。这个命名空间会作用于所有子元素(包括<address>),而你直接用root.iter('address')查找时,ElementTree会寻找没有命名空间的<address>元素,自然找不到目标内容。
解决方案:带上命名空间查找元素
方法1:直接使用命名空间完整路径
你可以在元素名前加上命名空间的完整URI,用大括号包裹,直接定位目标元素:
import xml.etree.ElementTree as ET tree = ET.parse('csr1kv_file.xml') root = tree.getroot() # 直接使用带命名空间的元素名查找 for address_elem in root.iter('{http://www.test.com/esc/esc}address'): # 获取元素的文本值(而非打印元素对象) print(address_elem.text)
方法2:定义命名空间前缀(更简洁易读)
如果需要多次查找不同元素,推荐定义命名空间映射,配合XPath表达式使用,代码可读性更强:
import xml.etree.ElementTree as ET tree = ET.parse('csr1kv_file.xml') root = tree.getroot() # 定义命名空间映射,前缀可自定义(这里用esc作为前缀) ns = {'esc': 'http://www.test.com/esc/esc'} # 使用XPath配合命名空间前缀查找所有address元素 for address_elem in root.findall('.//esc:address', ns): print(address_elem.text)
补充说明
- 你代码里的
ET.register_namespace("","http://www.test.com/esc/esc")主要用于保存XML时保留命名空间结构,对元素查找没有帮助,可根据需求选择保留或删除。 - 注意要打印
address_elem.text而非元素对象本身,这样才能得到10.25.0.0这个目标文本值。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

