You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Python中将XML数据读取并存储到变量中遇问题求助

问题排查与修复方案

你的代码没法正常运行,核心问题出在XML节点的查找逻辑上,咱们一步步拆解:

问题根源

先看你的XML结构:

<?xml version="1.0"?>
<Server>
  <name>johny</name>
  <address>statestreet</address>
  <city>Hyderabad</city>
</Server>

这里的根节点直接就是<Server>,而你代码里用了root.findall('Server')——这行代码是在根节点的子节点里找名为Server的元素,但你的根节点本身就是Server,自然找不到任何匹配项,循环体根本不会执行,所以nameaddresscity这些变量根本没被赋值。

另外还要注意,如果XML文件路径不对(比如sample.xml不在当前运行目录),也会触发文件找不到的错误,这个可以加个异常捕获来处理。

修复后的代码

直接使用root(也就是Server节点)来查找它的子元素就行,同时加上异常处理和元素存在性判断,避免报错:

import xml.etree.ElementTree as et

try:
    tree = et.parse('sample.xml')
    root = tree.getroot()
    
    # 直接从根节点(Server)查找子元素,同时处理元素不存在的情况
    name = root.find('name').text if root.find('name') is not None else "未知名称"
    address = root.find('address').text if root.find('address') is not None else "未知地址"
    city = root.find('city').text if root.find('city') is not None else "未知城市"
    
    # 验证结果
    print(f"名称:{name}")
    print(f"地址:{address}")
    print(f"城市:{city}")
except FileNotFoundError:
    print("错误:找不到sample.xml文件,请检查文件路径是否正确")
except Exception as e:
    print(f"运行出错:{str(e)}")

额外场景提示

如果你的XML后续会扩展成多个Server节点的结构(比如下面这种),那你原来的findall('Server')写法才适用:

<?xml version="1.0"?>
<Servers>
  <Server>
    <name>johny</name>
    <address>statestreet</address>
    <city>Hyderabad</city>
  </Server>
  <Server>
    <name>alice</name>
    <address>mainroad</address>
    <city>Delhi</city>
  </Server>
</Servers>

这种情况下,根节点是<Servers>,用root.findall('Server')就能遍历所有Server子节点了。

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

火山引擎 最新活动