从 TreeView 保存到 XML [英] Save to XML from TreeView

查看:31
本文介绍了从 TreeView 保存到 XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在从 TreeView 保存数据时遇到问题.我在谷歌上搜索了很多关于如何将数据从 TreeView 保存到 XML 的主题,我看到了一些如何做到这一点的方法.但是他们都在使用 WindowsForms 应用程序,而没有人 - WPF.我试图将这些示例转换为 WPF,但其中没有一个不能正常工作.有什么办法可以做到吗?我尝试移植的方法之一:

I have a problem with saving my data from TreeView. I've googled a lot of topics how to save data from TreeView to XML, and I saw i few methods how to make that. But all of them were using WindowsForms application, and nobody - WPF. I tried to convert those examples to WPF, but no one from them do not work correct. Is there any way to make it? One of the ways I tried to port:

    void SaveToXml(TreeView tw)
    {
        XmlDocument d = new XmlDocument();
        XmlNode n = d.CreateNode(XmlNodeType.Element, "root", "");
        foreach (TreeViewItem t in tw.Items)
        {
            n.AppendChild(getXmlNode(t, d));
        }
        d.AppendChild(n);
        d.Save(AppDomain.CurrentDomain.BaseDirectory + "out.xml");
    }
    private XmlNode getXmlNode(TreeViewItem tnode, XmlDocument d)
    {
        XmlNode n = d.CreateNode(XmlNodeType.Element, tnode.Name, " ");

        foreach (TreeViewItem t in tnode.Items)
        {
            n.AppendChild(getXmlNode(t, d));
        }
        return n;
    }

它抛出ArgumentException本地元素和属性的名称不能为空".我正在尝试使用以下代码在我的 D:\ 驱动器上保存有关文件的信息:

It throws ArgumentException "Local element's and attribute's names cannot be empty". I'm trying to save info about files on my D:\ drive using code:

  private void ListDirectory(TreeView treeView, string path)
    {
        var rootDirectoryInfo = new DirectoryInfo(path);
        treeView.Items.Add(CreateDirectoryNode(rootDirectoryInfo));
    }

    private static TreeViewItem CreateDirectoryNode(DirectoryInfo directoryInfo)
    {
        var directoryNode = new TreeViewItem();
        directoryNode.Header = directoryInfo.Name;
        try
        {
            foreach (var directory in directoryInfo.GetDirectories())
                directoryNode.Items.Add(CreateDirectoryNode(directory));
            foreach (var file in directoryInfo.GetFiles())
                directoryNode.Items.Add(new TreeViewItem { Header = file.Name });
        }
        catch (UnauthorizedAccessException e)
        { }
        return directoryNode;
    }

它工作正常,TreeView 显示所有文件夹和文件.请告诉我如何将数据从 TreeView 保存到 XML.谢谢.

It works fine, and TreeView shows all the folders and files. Please, show me how to save data from TreeView to XML. Thanks.

试过这个:

  public void exportToXml(TreeView tv, string filename)
    {
        sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
        //Write the header
        sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        //Write our root node
        sr.WriteLine("<ROOT>");
        foreach (TreeViewItem node in tv.Items)
        {
            saveNode(node.Items);
        }
        //Close the root node
        sr.WriteLine("</ROOT>");
        sr.Close();
    }

    private void saveNode(TreeViewItem[] tnc)
    {
        foreach (TreeViewItem node in tnc)
        {
            //If we have child nodes, we'll write 
            //a parent node, then iterrate through
            //the children
            if (node.Items.Count > 0)
            {
                sr.WriteLine("<" + node.Name + ">");
                saveNode(node.Items);
                sr.WriteLine("</" + node.Name + ">");
            }
            else //No child nodes, so we just write the text
                sr.WriteLine(node.Name);
        }
    }

但是 saveNode(node.Items);node.ItemsTreeViewItem[] 之间有不同的类型,所以我试过了List,但是报错是一样的.

But saveNode(node.Items); says that there are different types between node.Items and TreeViewItem[], so I tried List<TreeViewItem>, but error is the same.

推荐答案

恐怕这不是真正的答案,但您可以尝试替换此行:

I'm afraid this is not a real answer, but you may try replacing this line :

saveNode(node.Items); 

有了这个:

saveNode(node.Items.OfType<TreeViewItem>().ToArray()); 

希望这会有所帮助,

从 xml 文档中获取缩进字符串的示例:

Example of getting an indented string from an xml doc :

public static String ToString(XmlDocument doc)
{
    StringBuilder sb = new StringBuilder();
    XmlTextWriter mywriter = new XmlTextWriter(new StringWriter(sb));
    mywriter.Formatting = Formatting.Indented;
    doc.WriteTo( mywriter );
    mywriter.Flush();
    return(sb.ToString());
}

这篇关于从 TreeView 保存到 XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆