python 尝试解析xml会抛出FileNotFoundError

mcvgt66p  于 2023-10-14  发布在  Python
关注(0)|答案(4)|浏览(144)

我是Python新手,我所做的只是解析一个简单的XML字符串。但是当我这样做的时候,它在Et.parse上说“没有这样的文件或目录”。我也试着说Et.parse(Et.fromstring(xmlfile)),但仍然导致了一个稍微不同的异常。

  1. import xml.etree.ElementTree as ET
  2. thisDict={}
  3. def parseXML(xmlfile):
  4. tree = ET.parse(xmlfile)
  5. root=tree.getroot()
  6. for package in root.findall('package'):
  7. if package is None:
  8. continue
  9. if 'id' in package.attrib:
  10. thisDict['package']=package.get('id')
  11. if 'version' in package.attrib:
  12. thisDict['version']=package.get('version')
  13. for x, y in thisDict.items():
  14. print(x, y)
  15. xmlstr=f'''<?xml version="1.0" encoding="utf-8"?>
  16. <packages>
  17. <package id="Castle.Core" version="5.1.1" targetFramework="net481" />
  18. <package id="Moq" version="4.18.4" targetFramework="net481" />
  19. <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net481" />
  20. <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net481" />
  21. <package id="xunit" version="2.4.2" targetFramework="net481" />
  22. <package id="xunit.abstractions" version="2.0.3" targetFramework="net481" />
  23. <package id="xunit.analyzers" version="1.0.0" targetFramework="net481" />
  24. <package id="xunit.assert" version="2.4.2" targetFramework="net481" />
  25. <package id="xunit.core" version="2.4.2" targetFramework="net481" />
  26. <package id="xunit.extensibility.core" version="2.4.2" targetFramework="net481" />
  27. <package id="xunit.extensibility.execution" version="2.4.2" targetFramework="net481" />
  28. <package id="xunit.runner.visualstudio" version="2.4.5" targetFramework="net481" developmentDependency="true" />
  29. </packages>'''
  30. parseXML(xmlstr)
nhhxz33t

nhhxz33t1#

因为xml是一个字符串,你应该使用ET.fromstring
对我来说,这是有效的,但这意味着你应该调整你的代码,不读取文件:

  1. xml = '''<?xml version="1.0" encoding="utf-8"?>
  2. <packages>
  3. <package id="Castle.Core" version="5.1.1" targetFramework="net481" />
  4. <package id="Moq" version="4.18.4" targetFramework="net481" />
  5. <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net481" />
  6. <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net481" />
  7. <package id="xunit" version="2.4.2" targetFramework="net481" />
  8. <package id="xunit.abstractions" version="2.0.3" targetFramework="net481" />
  9. <package id="xunit.analyzers" version="1.0.0" targetFramework="net481" />
  10. <package id="xunit.assert" version="2.4.2" targetFramework="net481" />
  11. <package id="xunit.core" version="2.4.2" targetFramework="net481" />
  12. <package id="xunit.extensibility.core" version="2.4.2" targetFramework="net481" />
  13. <package id="xunit.extensibility.execution" version="2.4.2" targetFramework="net481" />
  14. <package id="xunit.runner.visualstudio" version="2.4.5" targetFramework="net481" developmentDependency="true" />
  15. </packages>'''
  16. tree = ET.fromstring(xml)
  17. tree.findall('package')

如果你想使用你的函数,你可以使用io包:

  1. import io
  2. def parseXML(xmlfile):
  3. tree = ET.parse(xmlfile)
  4. root=tree.getroot()
  5. thisDict = {}
  6. for package in root.findall('package'):
  7. if package is None:
  8. continue
  9. if 'id' in package.attrib:
  10. thisDict['package']=package.get('id')
  11. if 'version' in package.attrib:
  12. thisDict['version']=package.get('version')
  13. for x, y in thisDict.items():
  14. print(x, y)
  15. parseXML(io.StringIO(xml))
  • 注意我在你的函数中添加了thisDict = {}。但它可能不是你想要的,因为每次发现新的包时,'package'键都会被覆盖。
展开查看全部
7y4bm7vi

7y4bm7vi2#

你可以用

  1. root = ET.fromstring(xmlstr)

根据documentation
原因是当您使用tree = ET.parse(xmlfile)时,它搜索的是一个文件,而不是一个字符串

cqoc49vn

cqoc49vn3#

通过阅读文件导入此数据:

  1. import xml.etree.ElementTree as ET
  2. tree = ET.parse('country_data.xml')
  3. root = tree.getroot()

或者直接从字符串中读取:

  1. root = ET.fromstring(country_data_as_string)

你应该使用这个:

  1. def parseXML(xmlfile):
  2. root = ET.fromstring(xmlfile)
  3. ...
dfty9e19

dfty9e194#

简单的方法是使用pandas:

  1. import pandas as pd
  2. xmlstr=f'''<?xml version="1.0" encoding="utf-8"?>
  3. <packages>
  4. <package id="Castle.Core" version="5.1.1" targetFramework="net481" />
  5. <package id="Moq" version="4.18.4" targetFramework="net481" />
  6. <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net481" />
  7. <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net481" />
  8. <package id="xunit" version="2.4.2" targetFramework="net481" />
  9. <package id="xunit.abstractions" version="2.0.3" targetFramework="net481" />
  10. <package id="xunit.analyzers" version="1.0.0" targetFramework="net481" />
  11. <package id="xunit.assert" version="2.4.2" targetFramework="net481" />
  12. <package id="xunit.core" version="2.4.2" targetFramework="net481" />
  13. <package id="xunit.extensibility.core" version="2.4.2" targetFramework="net481" />
  14. <package id="xunit.extensibility.execution" version="2.4.2" targetFramework="net481" />
  15. <package id="xunit.runner.visualstudio" version="2.4.5" targetFramework="net481" developmentDependency="true" />
  16. </packages>'''
  17. df = pd.read_xml(xmlstr, xpath = './/*')
  18. print(df.to_string(index=False))

输出量:

  1. id version targetFramework developmentDependency
  2. Castle.Core 5.1.1 net481 None
  3. Moq 4.18.4 net481 None
  4. System.Runtime.CompilerServices.Unsafe 4.5.3 net481 None
  5. System.Threading.Tasks.Extensions 4.5.4 net481 None
  6. xunit 2.4.2 net481 None
  7. xunit.abstractions 2.0.3 net481 None
  8. xunit.analyzers 1.0.0 net481 None
  9. xunit.assert 2.4.2 net481 None
  10. xunit.core 2.4.2 net481 None
  11. xunit.extensibility.core 2.4.2 net481 None
  12. xunit.extensibility.execution 2.4.2 net481 None
  13. xunit.runner.visualstudio 2.4.5 net481 true

Pandas也有一个用于dict()的嵌套结构:

  1. d = df.to_dict('records')
  2. print(d)

输出量:

  1. [{'id': 'Castle.Core', 'version': '5.1.1', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'Moq', 'version': '4.18.4', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'System.Runtime.CompilerServices.Unsafe', 'version': '4.5.3', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'System.Threading.Tasks.Extensions', 'version': '4.5.4', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit', 'version': '2.4.2', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.abstractions', 'version': '2.0.3', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.analyzers', 'version': '1.0.0', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.assert', 'version': '2.4.2', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.core', 'version': '2.4.2', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.extensibility.core', 'version': '2.4.2', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.extensibility.execution', 'version': '2.4.2', 'targetFramework': 'net481', 'developmentDependency': None}, {'id': 'xunit.runner.visualstudio', 'version': '2.4.5', 'targetFramework': 'net481', 'developmentDependency': 'true'}]
展开查看全部

相关问题