如何使用Python的ElementTree获取XML中的同级标签值
使用ElementTree获取XML中指定同级元素的值
你的需求是从带命名空间的XML里,找到Tag11为John和Jin对应的Tag13值,核心要点是处理XML的命名空间——因为默认命名空间会导致直接用标签名查找元素失败,下面是具体实现:
示例代码
首先导入模块并定义XML内容(如果是从文件读取,用ET.parse('your_file.xml')即可):
import xml.etree.ElementTree as ET # 示例XML内容 xml_content = """ <MainTag xmlns="http://www.exmple.com"> <Tag1> <Tag11>Sam</Tag11> <Tag12>New York</Tag12> <Tag13>21</Tag13> <Tag14>Dance</Tag14> </Tag1> <Tag1> <Tag11>John</Tag11> <Tag12>New York</Tag12> <Tag13>23</Tag13> <Tag14>Music</Tag14> </Tag1> <Tag1> <Tag11>Jenny</Tag11> <Tag12>Sydney</Tag12> <Tag13>20</Tag13> </Tag1> <Tag1> <Tag11>Jin</Tag11> <Tag12>Jakarta</Tag12> <Tag13>20</Tag13> <Tag14>Music</Tag14> </Tag1> </MainTag> """ # 解析XML tree = ET.ElementTree(ET.fromstring(xml_content)) root = tree.getroot() # 定义命名空间字典,前缀可以随便取(比如这里用ex) ns = {'ex': 'http://www.exmple.com'}
方法1:遍历所有Tag1元素
逐个检查每个Tag1下的Tag11值,匹配目标名字后提取Tag13:
target_names = {'John', 'Jin'} result = {} for tag1 in root.findall('ex:Tag1', ns): name = tag1.find('ex:Tag11', ns).text if name in target_names: age = tag1.find('ex:Tag13', ns).text result[name] = age print(result) # 输出: {'John': '23', 'Jin': '20'}
方法2:用XPath直接定位
通过XPath表达式精准匹配目标节点,代码更简洁:
target_names = {'John', 'Jin'} result = {} for name in target_names: # 构造XPath:找到所有Tag1下Tag11文本等于目标名字的节点,再取对应的Tag13 xpath = f".//ex:Tag1[ex:Tag11='{name}']/ex:Tag13" tag13_node = root.find(xpath, ns) if tag13_node: result[name] = tag13_node.text print(result) # 输出: {'John': '23', 'Jin': '20'}
关键说明
XML中的xmlns="http://www.exmple.com"定义了默认命名空间,所有子元素都属于这个命名空间,因此查找元素时必须通过命名空间前缀(比如示例中的ex:)来指定,否则ElementTree会找不到对应的节点。
内容的提问来源于stack exchange,提问作者MakHingse
相关产品推荐
相关产品推荐

