You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:03:12