如何通过Python获取XML中level元素内带实体与值的元素值
嘿,我来给你捋捋怎么用Python搞定这个XML提取的需求!要获取<level>元素内那些带实体(属性)和值的元素内容,咱们可以用Python的标准库或者更强大的第三方库来实现,下面给你详细说说两种常用方法:
先补全一下你的示例XML(方便演示)
假设你的完整XML片段是这样的(补全了<level>内的元素):
<observations> <station wmo-id="94576" bom-id="040913" tz="Australia/Brisbane" stn-name="BRISBANE" stn-height="8.13" type="AWS" lat="-27.4808" lon="153.0389" forecast-district-id="QLD_PW015" description="Brisbane"> <period index="0" time-utc="2018-03-29T05:50:00+00:00" time-local="2018-03-29T15:50:00+10:00" wind-src="OMD"> <level index="0" type="surface"> <element type="air_temp" units="C">23.5</element> <element type="dew_point" units="C">19.2</element> <element type="wind_speed" units="km/h">15</element> </level> </period> </station> </observations>
方法一:用标准库xml.etree.ElementTree(无需额外安装)
这是Python自带的XML解析库,足够应付大多数简单场景:
1. 解析XML内容
你可以从字符串或者本地文件解析XML:
import xml.etree.ElementTree as ET # 从字符串解析(如果是本地文件,用ET.parse('your_file.xml').getroot()) xml_str = """ <observations> <station wmo-id="94576" bom-id="040913" tz="Australia/Brisbane" stn-name="BRISBANE" stn-height="8.13" type="AWS" lat="-27.4808" lon="153.0389" forecast-district-id="QLD_PW015" description="Brisbane"> <period index="0" time-utc="2018-03-29T05:50:00+00:00" time-local="2018-03-29T15:50:00+10:00" wind-src="OMD"> <level index="0" type="surface"> <element type="air_temp" units="C">23.5</element> <element type="dew_point" units="C">19.2</element> <element type="wind_speed" units="km/h">15</element> </level> </period> </station> </observations> """ root = ET.fromstring(xml_str)
2. 提取<level>内的元素属性和值
用XPath语法定位到<level>元素,再遍历它的子元素,获取属性(实体)和文本内容(值):
# 找到所有<level>元素 all_levels = root.findall('.//level') for level in all_levels: print(f"当前处理的level索引: {level.get('index')}") # 遍历level下的所有子元素 for elem in level: # 获取元素的属性(比如type、units) elem_type = elem.get('type') elem_units = elem.get('units') # 获取元素的文本值 elem_value = elem.text.strip() print(f"实体类型: {elem_type}, 单位: {elem_units}, 值: {elem_value}")
运行这段代码,你就能看到每个元素的属性和对应值了。
方法二:用lxml库(更强大的XPath支持)
如果你的XML有命名空间,或者需要更复杂的查询,lxml会更顺手。先安装它:
pip install lxml
然后用下面的代码实现:
from lxml import etree # 解析XML字符串 root = etree.fromstring(xml_str) # 直接用XPath获取所有<level>下的子元素 level_children = root.xpath('//level/*') for elem in level_children: # 获取元素的所有属性 elem_attrs = elem.attrib # 获取元素的文本值 elem_value = elem.text.strip() print(f"属性集合: {elem_attrs}, 值: {elem_value}") # 还可以精准定位特定属性的元素,比如获取气温值 air_temp_value = root.xpath('//level/element[@type="air_temp"]/text()')[0] print(f"当前气温: {air_temp_value}°C")
几个小提醒
- 如果你的XML包含命名空间,记得在查询时添加命名空间映射,比如:
# ElementTree的写法 ns = {'obs': 'http://your-namespace-url.com'} all_levels = root.findall('.//obs:level', namespaces=ns) - 确保XML格式合法,比如标签要闭合,否则解析会报错。
内容的提问来源于stack exchange,提问作者Derek Lee
相关产品推荐
相关产品推荐

