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

如何用Python xml.etree.ElementTree提取XML指定子标签文本?

提取XML指定子标签内容的解决方案

示例XML结构

假设你的XML结构如下:

<response>
  <result>
    <job>
      <type>full_sync</type>
      <status>success</status>
      <result>data_updated</result>
      <timestamp>2024-05-20</timestamp>
      <user>admin</user>
    </job>
    <job>
      <type>incremental_sync</type>
      <status>failed</status>
      <result>connection_timeout</result>
      <timestamp>2024-05-21</timestamp>
    </job>
  </result>
</response>

Python 代码实现

使用xml.etree.ElementTree库,可以通过两种方式提取type、status、result三个标签的文本:

方法1:遍历Job节点提取指定标签

这种方式逻辑清晰,还能处理标签不存在的情况:

import xml.etree.ElementTree as ET

# 解析XML(如果是本地文件,替换为ET.parse('your_file.xml').getroot())
xml_content = """
<response>
  <result>
    <job>
      <type>full_sync</type>
      <status>success</status>
      <result>data_updated</result>
      <timestamp>2024-05-20</timestamp>
      <user>admin</user>
    </job>
    <job>
      <type>incremental_sync</type>
      <status>failed</status>
      <result>connection_timeout</result>
      <timestamp>2024-05-21</timestamp>
    </job>
  </result>
</response>
"""
root = ET.fromstring(xml_content)

# 定义需要提取的目标标签
target_tags = ['type', 'status', 'result']

# 遍历所有job节点
for job in root.findall('./result/job'):
    print("Job 信息:")
    for tag in target_tags:
        elem = job.find(tag)
        # 处理标签不存在的情况,避免报错
        text = elem.text.strip() if elem is not None else "未找到该标签"
        print(f"{tag}: {text}")
    print("---")

方法2:用XPath直接定位标签

如果确认标签一定存在,可以简化为直接通过XPath获取:

# 沿用上面的root对象
print("\nXPath方式提取:")
for job in root.findall('./result/job'):
    type_val = job.find('./type').text.strip()
    status_val = job.find('./status').text.strip()
    result_val = job.find('./result').text.strip()
    print(f"类型:{type_val},状态:{status_val},结果:{result_val}")

常见问题排查

你之前XPath失败大概率是这两个原因:

  1. 路径层级错误:如果从根节点开始,正确的XPath应该是./result/job/status(相对路径)或/response/result/job/status(绝对路径),不要漏掉中间的result节点。
  2. XML含命名空间:如果你的XML带有xmlns属性(比如<response xmlns="http://your-namespace.com">),需要先注册命名空间才能用XPath定位:
# 注册命名空间前缀
ET.register_namespace('', 'http://your-namespace.com')
# 或者直接使用命名空间URI定位标签
for job in root.findall('.//{http://your-namespace.com}job'):
    type_elem = job.find('{http://your-namespace.com}type')
    # 后续提取逻辑和之前一致

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:50:25