如何用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
相关产品推荐
相关产品推荐

