2011-06-21 30 views
3

我正在处理一个项目,我需要将treeview转换为xml,以便我可以将该xml数据发送到另一个端口。如何将treeview转换为xml?

+0

Windows窗体,WPF,ASP.NET,...? –

+0

你已经试过了什么代码? –

+0

Windows窗体...我很新...所以我只做了研究,我找不到任何代码 – james

回答

5
private void button1_Click(object sender, EventArgs e) 
{ 
    var rootElement = new XElement("root", CreateXmlElement(treeView1.Nodes)); 
    var document = new XDocument(rootElement); 
    document.Save("C:\\1.xml"); 
} 

private static List<XElement> CreateXmlElement(TreeNodeCollection treeViewNodes) 
{ 
    var elements = new List<XElement>(); 
    foreach (TreeNode treeViewNode in treeViewNodes) 
    { 
     var element = new XElement(treeViewNode.Name); 
     if (treeViewNode.GetNodeCount(true) == 1) 
      element.Value = treeViewNode.Nodes[0].Name; 
     else 
      element.Add(CreateXmlElement(treeViewNode.Nodes)); 
     elements.Add(element); 
    } 
    return elements; 
} 
+0

应该更改为(treeViewNode.GetNodeCount(true)== 0) – mcuw

+0

@mcuw:不正确。如果(treeViewNode.GetNodeCount(true)== 0),那么treeViewNode.Nodes [0] = null。因此,element.Value = treeViewNode.Nodes [0] .Name会导致崩溃。 – JSON

+0

当我使用已经有根注释的XML填充我的树形视图(所以我的树形视图以root开头),此代码每次导出时都会添加另一个根。是否有某种方法可以跳过树视图中的特定节点(而不是其子节点)或跳过导出的根创建? – Dante1986

1
Here is the code snippet : 

    public void exportToXml(TreeView tv, string filename) 
    { 
     sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8); 
     sr.WriteLine("<" + tv.Nodes[0].Text + ">"); 
     foreach (TreeNode node in tv.Nodes) 
     { 
      saveNode(node.Nodes); 
     } 
     //Close the root node 
     sr.WriteLine("</" + tv.Nodes[0].Text + ">"); 
     sr.Close(); 
    } 

    private void saveNode(TreeNodeCollection tnc) 
    { 
     foreach (TreeNode node in tnc) 
     { 

      if (node.Nodes.Count > 0) 
      { 
       sr.Write("<" + node.Text + ">"); 
       saveNode(node.Nodes); 
       sr.WriteLine("</" + node.Text + ">"); 
      } 
      else 
       sr.Write(node.Text); 
     } 
    }