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

如何用Python提取XML指定标签内容?现有代码输出不符预期

提取XML指定标签内容的问题解决

问题说明

需要从给定XML文件中提取APL01_deviceType和ETK这两处内容,但使用xml.etree.ElementTree编写的代码输出不符合预期。

目标XML文件

<?xml version="1.0" encoding="utf-8"?>
<GLOBAL-CONSTANTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <GLOBAL-CONSTANT format-rev="1" xsi:type="globalConstEntry">
        <NAME xsi:type="string">APL01_deviceType</NAME>
        <VALUE xsi:type="listOrTupleBaseExpression">
            <IS-LIST xsi:type="boolean">False</IS-LIST>
            <EXPRESSION-LIST>
                <BASE-EXPRESSION format-rev="1" xsi:type="valueBaseExpression"/>
                <BASE-EXPRESSION format-rev="1" xsi:type="valueBaseExpression">
                    <VALUE xsi:type="string">ETK</VALUE>
                </BASE-EXPRESSION>
            </EXPRESSION-LIST>
        </VALUE>
    </GLOBAL-CONSTANT>
</GLOBAL-CONSTANTS>

尝试的代码

import xml.etree.ElementTree as ET

mytree = ET.parse(r"C:\Desktop\ex_Test_constant.xml")
myroot = mytree.getroot()
lenof = range(len(myroot))
print(lenof)
print("len:",len(myroot))
for i in lenof:
    print(myroot[i].tag)
    for x in myroot[i]:
        print(x.tag)
        print(x.text)

输出对比

  • 预期输出:
NAME: APL01_deviceType
VALUE: ETK
  • 实际输出:
range(0, 9)
len: 9
GLOBAL-CONSTANT
NAME
APL01_deviceType
VALUE

问题原因

原代码仅遍历了GLOBAL-CONSTANT的直接子节点,而目标ETK嵌套在VALUE -> EXPRESSION-LIST -> BASE-EXPRESSION[2] -> VALUE的深层结构中,且外层VALUE节点本身没有直接文本内容,因此无法被原代码提取到。

解决方案

方法1:逐层定位节点

通过逐层查找子节点的方式精准定位目标内容:

import xml.etree.ElementTree as ET

mytree = ET.parse(r"C:\Desktop\ex_Test_constant.xml")
myroot = mytree.getroot()

# 获取全局常量节点
const_node = myroot.find('GLOBAL-CONSTANT')
# 提取NAME标签内容
name_content = const_node.find('NAME').text
# 逐层定位到存储ETK的VALUE节点
target_value_node = const_node.find('VALUE') \
    .find('EXPRESSION-LIST') \
    .findall('BASE-EXPRESSION')[1] \
    .find('VALUE')
value_content = target_value_node.text

# 按预期格式输出
print(f"NAME: {name_content}")
print(f"VALUE: {value_content}")

方法2:使用XPath表达式

利用XPath直接定位目标节点,代码更简洁:

import xml.etree.ElementTree as ET

mytree = ET.parse(r"C:\Desktop\ex_Test_constant.xml")
myroot = mytree.getroot()

# 通过XPath提取NAME内容
name_content = myroot.find('.//GLOBAL-CONSTANT/NAME').text
# 通过XPath定位第二个BASE-EXPRESSION下的VALUE内容
value_content = myroot.find('.//GLOBAL-CONSTANT/VALUE/EXPRESSION-LIST/BASE-EXPRESSION[2]/VALUE').text

# 按预期格式输出
print(f"NAME: {name_content}")
print(f"VALUE: {value_content}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:43:00