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