IronPython 中的 .Net 2.0 XML 读取器

0 投票
1 回答
3133 浏览
提问于 2025-04-17 17:10

我写了一个XML读取器,它生成了一个格式很简单的列表,不过我这个脚本需要这样的格式。

import xml.etree.ElementTree as ET

PATH_IN = "<Path>\sweep.xml"

tree = ET.parse(PATH_IN)
root = tree.getroot()

Input = []
for project in root:

    for design in project:
        list_lvl2 = []
        list_lvl2.append(project.get('name'))
        list_lvl2.append(design.get('name'))
        list_lvl2.append('')

        list_lvl3 = [] 
        for param in design:
            list_lvl4 = []
            list_lvl4.append(param.get('name'))
            list_lvl5 = []
            for steps in param:
                list_lvl5.append(steps.text)
            list_lvl4.append(list_lvl5)
            list_lvl4.append(param.get('unit'))
            list_lvl3.append(list_lvl4)
        list_lvl2.append(list_lvl3)
        Input.append(list_lvl2)

问题是我必须在一个程序的脚本接口中运行它,这个程序使用的是IronPython 2.6.10920.0,基于.NET 2.0.50727.5466。而且它报了以下错误:

*Global - Messages
  [error] ImportException: No module named expat; use SimpleXMLTreeBuilder instead  In file "<Path>/sweep.py", line 36 ---- While executing script: <Path>/sweep.py
  [error] Error executing script in <Path>\sweep.py:
  [error] ImportException: No module named expat; use SimpleXMLTreeBuilder instead  In file "<Path>/sweep.py", line 36 ---- While executing script: <Path>/sweep.py
  [error] Error executing script in <Path>\sweep.py:

我不明白的是,使用同一个模块的另一个脚本却能正常工作:

import xml.etree.ElementTree as ET

path = "<Path>\projects.xml"

root = ET.Element('xml')
projects = oDesktop.GetProjectList()
for i in projects:
    project = ET.SubElement(root,'project')
    project.set('name', i)
    designs = oDesktop.SetActiveProject(i).GetTopDesignList()
    for u in designs:
        design = ET.SubElement(project,'design')
        design.set('name', u)
        vars = oDesktop.SetActiveProject(i).GetDesign(u).GetVariables()
        for z in vars:
            param = ET.SubElement(design,'param')
            param.set('name', z)
            value = ET.SubElement(param,'value')
            value.text = oDesktop.SetActiveProject(i).GetDesign(u).GetVariableValue(z)
f = open(path, "w")
tree = ET.ElementTree(root)
tree.write(f)

f.close()

oDesktop这些只是程序特定的函数,用来获取数据。我真的不明白为什么第一个脚本不行,我猜可能是因为.NET 2.0的原因。

更新:在查了一下expat是什么之后,我更加困惑了,因为我从来没有在任何地方用过它,而我使用的所有elementtree函数在这个版本的IronPython中应该都是支持的。尽管如此,在这一行 tree = ET.parse(PATH_IN) 还是给我报了expat的错误。

更新:我尝试使用 from elementtree import SimpleXMLTreeBuilder as ET,结果是:

*Global - Messages
  [error] ImportException: No module named elementtree  In file "<Path>/sweep.py", line 3 ---- While executing script: <Path>/sweep.py
  [error] Error executing script in <Path>\sweep.py:

1 个回答

1

这里的基本问题是,ElementTree使用expat来解析XML文件,但expat是一个用C语言写的库,通过CPython的包装可以在Python中使用,而在IronPython中无法使用。

不过,ElementTree可以使用另一种树构建器,这种构建器是由不同的解析器驱动的,比如.NET中的XMLReader解析器。搜索“xmlreader treebuilder”可以找到这个结果,它似乎既描述了你的问题,也提供了一个替代的树构建器实现(MIT许可证),这个实现使用了XMLReader。

撰写回答