2011-06-05 46 views
2

TreeNode上IEnumerator的有效参数是什么?TreeNode上IEnumerator的参数

我得到了这行错误:

IEnumerator ie = tn.Nodes.GetEnumerator(); 

在这个方法:

private void parseNode(TreeNode tn) 
    { 
     IEnumerator ie = tn.Nodes.GetEnumerator(); 

     string parentnode = ""; 

     parentnode = tn.Text; 

     while (ie.MoveNext()) 
     { 
      TreeNode ctn = (TreeNode)ie.Current; 

      if (ctn.GetNodeCount(true) == 0) 
      { 
       _nodeToString += ctn.Text; 
      } 
      else 
      { 
       _nodeToString += "<" + ctn.Text + ">"; 
      } 
      if (ctn.GetNodeCount(true) > 0) 
      { 
       parseNode(ctn); 
      } 
     } 

     _nodeToString += "</" + parentnode + ">"; 
     _nodeToString += "\n"; 
    } 
+3

正交试验的问题,但为什么不使用'foreach(tn.Nodes中的TreeNode节点)'? – 2011-06-05 15:00:45

+4

,你也会得到什么错误?这将有助于知道... – 2011-06-05 15:01:14

+2

你是通过字符串连接构建XML?这是不是一个好主意......'XmlWriter'会是理想的... – 2011-06-05 15:04:09

回答

5

(从评论)

使用泛型类型“System.Collections.Generic .IEnumerator'需要'1'类型参数

这意味着你有

using System.Collections.Generic; 

,而不是

using System.Collections; 

开关后,它会工作。 IEnumerable/IEnumerator是非通用API。

或更好:使用foreach - 它更简单,更安全和更正确(例如,您不记得检查IDisposable)。

其他备注:

  • 在回路连接字符串是非常不好 - 它会导致伸缩式串分配(即,大量的中间串);像StringBuilder是首选长边
  • 建设xml手工并不理想 - 你需要编码等; XmlWriter将是理想的

所以IMO:使用XmlWriter写入到StringBuilder,使用foreach

未经检验的,但这样的:

private string parseNode(TreeNode tn) 
    { 
     var sb = new StringBuilder(); 
     using (var writer = XmlWriter.Create(sb)) 
     { 
      writer.WriteStartElement("xml"); 
      parseNode(tn, writer); 
      writer.WriteEndElement(); 
     } 
     return sb.ToString(); 
    } 
    private void parseNode(TreeNode tn, XmlWriter writer) 
    { 
     if (tn.Nodes.Count > 0) 
     { 
      writer.WriteStartElement(tn.Text); 
      foreach (TreeNode child in tn.Nodes) 
      { 
       parseNode(child, writer); 
      } 
      writer.WriteEndElement(); 
     } 
     else 
     { 
      writer.WriteString(tn.Text); 
     } 
    } 
+0

或者使用System.Collections.IEnumerator而不是“IEnumerator”。 – 2011-06-05 15:18:13

+0

这就是为什么我爱stackoverflow.com ..我在这里学到很多.. :)谢谢先生marc .. – 2011-06-05 15:32:04

+0

无论如何,在writer.WriteStartElement(tn.Text)有一个argumentexception;它在'f:\'中表示无效的名称字符。 ':'字符(十六进制值0x3A)不能包含在名称中。 – 2011-06-05 15:34:52