将指定XML结构转为Python字典/列表并实现迭代的最优方案
没问题!我来帮你搞定把XML转成Python字典/列表,还有反向迭代的需求~ 下面是具体的解决方案,完全适配<url>标签数量可变的场景:
解析XML到Python字典/列表
首先咱们用Python标准库的xml.etree.ElementTree来解析,不用装额外的包,方便又靠谱。先把你的XML结构整理得更清晰些:
<application name="ap1"> <dashboards name=""> <title>Head</title> <duration>20</duration> <urls> <url>ur1-l</url> <!-- 这里可以放任意数量的<url>标签 --> <url>url-n</url> </urls> </dashboards> </application>
具体解析代码
这段代码会把XML转成嵌套的字典,自动把所有<url>标签收集到列表里,不管数量多少都能处理:
import xml.etree.ElementTree as ET # 你可以把XML内容存在字符串里,或者用ET.parse()读取本地XML文件 xml_content = ''' <application name="ap1"> <dashboards name=""> <title>Head</title> <duration>20</duration> <urls> <url>ur1-l</url> <url>url-2</url> <url>url-n</url> </urls> </dashboards> </application> ''' # 解析XML内容 root = ET.fromstring(xml_content) # 构建最终的字典结构 app_data = { 'application_name': root.attrib['name'], 'dashboards': { 'dashboards_name': root.find('dashboards').attrib['name'], 'title': root.find('dashboards/title').text, 'duration': int(root.find('dashboards/duration').text), # 转成整数,按需调整类型 'urls': [url.text for url in root.find('dashboards/urls').findall('url')] } } # 打印看看结果 print(app_data)
运行后你会得到这样的字典,所有<url>都乖乖待在urls列表里:
{ 'application_name': 'ap1', 'dashboards': { 'dashboards_name': '', 'title': 'Head', 'duration': 20, 'urls': ['ur1-l', 'url-2', 'url-n'] } }
反向迭代URL列表
有了URL列表之后,反向迭代有三种常用方法,按需选就行:
方法1:用reversed()(不修改原列表)
这个方法会生成一个反向迭代器,不会改动原列表,适合只是临时遍历的场景:
# 先取出URL列表 urls_list = app_data['dashboards']['urls'] # 反向遍历打印 for url in reversed(urls_list): print(url)
输出结果:
url-n url-2 ur1-l
方法2:用reverse()修改原列表
如果需要永久反转列表本身,就用列表的reverse()方法:
urls_list = app_data['dashboards']['urls'] urls_list.reverse() # 原列表被反转 # 遍历反转后的列表 for url in urls_list: print(url)
输出和上面一样,但原列表已经变成反向的了。
方法3:切片生成新的反转列表
要是想得到一个新的反转列表,又不想动原列表,用切片[::-1]就好:
urls_list = app_data['dashboards']['urls'] reversed_urls = urls_list[::-1] # 创建新的反转列表 for url in reversed_urls: print(url)
这种方式原列表保持不变,新列表是反向的。
额外扩展:处理多个
<dashboards>标签(可选) 如果你的XML里可能有多个<dashboards>,只需要把dashboards改成列表就行,代码调整如下:
# 示例:包含多个dashboards的XML xml_content_multi = ''' <application name="ap1"> <dashboards name="dash1"> <title>Head1</title> <duration>20</duration> <urls> <url>url1-1</url> <url>url1-2</url> </urls> </dashboards> <dashboards name="dash2"> <title>Head2</title> <duration>30</duration> <urls> <url>url2-1</url> </urls> </dashboards> </application> ''' root_multi = ET.fromstring(xml_content_multi) app_data_multi = { 'application_name': root_multi.attrib['name'], 'dashboards': [] # 改成列表存储多个dashboard } # 遍历所有dashboards for dashboard in root_multi.findall('dashboards'): dash_data = { 'dashboards_name': dashboard.attrib['name'], 'title': dashboard.find('title').text, 'duration': int(dashboard.find('duration').text), 'urls': [url.text for url in dashboard.find('urls').findall('url')] } app_data_multi['dashboards'].append(dash_data) # 比如反向迭代第二个dashboard的urls for url in reversed(app_data_multi['dashboards'][1]['urls']): print(url)
这样不管有多少个<dashboards>或者<url>,都能完美处理啦~
内容的提问来源于stack exchange,提问作者vas
相关产品推荐
相关产品推荐

