Python解析XML字符串触发FileNotFoundError问题求助
问题原因与解决方法
核心错误
ET.parse() 方法的作用是读取并解析本地XML文件,它接收的参数是文件路径字符串,而你传入的是XML内容字符串,Python会把这个字符串当成文件名去本地查找,所以报错"No such file or directory"。
另外,ET.parse(ET.fromstring(xmlfile)) 也不对,因为ET.fromstring()返回的是XML元素对象,而ET.parse()需要的是文件路径或类文件对象,两者不兼容。
正确的XML字符串解析方式
有两种常用方法处理XML字符串:
方法1:直接用ET.fromstring()获取根节点
跳过ET.parse()和tree.getroot(),直接用ET.fromstring()解析字符串得到根元素:
import xml.etree.ElementTree as ET # 改用列表存储所有package信息,避免覆盖 package_list = [] def parseXML(xmlstr): root = ET.fromstring(xmlstr) for package in root.findall('package'): pkg_info = {} if 'id' in package.attrib: pkg_info['package'] = package.get('id') if 'version' in package.attrib: pkg_info['version'] = package.get('version') if pkg_info: package_list.append(pkg_info) # 遍历输出所有package for idx, pkg in enumerate(package_list, 1): print(f"Package {idx}: {pkg}") xmlstr=f'''<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Castle.Core" version="5.1.1" targetFramework="net481" /> <package id="Moq" version="4.18.4" targetFramework="net481" /> <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net481" /> <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net481" /> <package id="xunit" version="2.4.2" targetFramework="net481" /> <package id="xunit.abstractions" version="2.0.3" targetFramework="net481" /> <package id="xunit.analyzers" version="1.0.0" targetFramework="net481" /> <package id="xunit.assert" version="2.4.2" targetFramework="net481" /> <package id="xunit.core" version="2.4.2" targetFramework="net481" /> <package id="xunit.extensibility.core" version="2.4.2" targetFramework="net481" /> <package id="xunit.extensibility.execution" version="2.4.2" targetFramework="net481" /> <package id="xunit.runner.visualstudio" version="2.4.5" targetFramework="net481" developmentDependency="true" /> </packages>''' parseXML(xmlstr)
方法2:用StringIO包装字符串为类文件对象
如果想保留ET.parse()的调用方式,可以用io.StringIO把XML字符串包装成类文件对象:
import xml.etree.ElementTree as ET from io import StringIO package_list = [] def parseXML(xmlstr): # 把字符串包装成类文件对象 xml_file = StringIO(xmlstr) tree = ET.parse(xml_file) root = tree.getroot() for package in root.findall('package'): pkg_info = {} if 'id' in package.attrib: pkg_info['package'] = package.get('id') if 'version' in package.attrib: pkg_info['version'] = package.get('version') if pkg_info: package_list.append(pkg_info) for idx, pkg in enumerate(package_list, 1): print(f"Package {idx}: {pkg}") # 调用部分同上 parseXML(xmlstr)
额外修正说明
你原代码中的thisDict会被每个package的属性覆盖,最终只能保留最后一个package的信息,所以改成了package_list列表来存储所有package的信息,这样能完整输出所有数据。
内容的提问来源于stack exchange,提问作者nikhil
相关产品推荐
相关产品推荐

