2013-02-26 51 views
0

我创建了一个XML读取器,它创建了一个非常笨的格式化List,但使用它的脚本需要这种方式。.Net 2.0中的IronPython 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) 

问题是我在.NET上2.0.50727.5466使用IronPython的2.6.10920.0程序的脚本接口来执行它。而它抛出以下错误:

*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和这样是获取数据只是programspecific功能。 我真的不明白为什么第一个脚本不能工作,我猜是因为NET 2.0。

更新:查找expat后,我更加困惑,因为我从不在任何地方使用它,所以我使用的所有elementtree函数都应该支持这个版本的Iron Python。不过它给我的外籍错误在这条线tree = ET.parse(PATH_IN)

UPDATE:我试着用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: 
+0

默认情况下,'ElementTree'使用'expat'来解析xml。你的其他脚本是*写* XML不解析*,所以没有问题。尽管如此,你仍然会遇到这个错误仍然很奇怪。也许你的IronPython安装被破坏了?尝试使用[另一个treebuilder](http://stackoverflow.com/a/2067177/1002469),甚至使用.NET XML解析器查找/制作自己的树型构建器。 – 2013-02-26 12:49:47

+0

我的铁蟒字典中没有elementtree文件夹还有没有其他使用expat的xml读者? – Yui 2013-02-26 14:59:23

回答

1

这里的基本问题是,ElementTree的使用外籍XML解析,但外籍人士(一个C库通过CPython包装提供给Python)不能在IronPython中使用。

但是,ElementTree可以使用由不同解析器驱动的不同树形成器,例如, .NET中的XMLReader解析器。搜索“xmlreader treebuilder”会产生this result,这似乎同时描述了您的问题提供了使用XMLReader的替代树构建器实现(MIT许可证)。

+0

我已经找到了这个https://github.com/ixc/elementtree。看来这个库在我不得不在工作中使用的IronPython实现中丢失了。我可以使用SimpleXMLTreeBuilder。如果没有你的帮助,我还是不会这么想的,所以非常感谢你 – Yui 2013-02-26 15:41:12

+0

哦,expat在最新的Iron Python版本中工作,看起来他们只是在2.6 http://ironpython.codeplex.com/workitem/31579 – Yui 2013-02-26 15:44:28