在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,自然找不到任何匹配项,循环体根本不会执行,所以name、address、city这些变量根本没被赋值。
另外还要注意,如果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




