c# - 将 TreeView 保存为带有属性和元素的 xml

标签 c# xml winforms recursion treenode

我有一个 Windows 窗体 TreeView,需要将其保存为 xml 文件。

TreeView的结构是这样的:

 - Parent
  - Child 1 (Any value)
  - Child 2
    - Child 1 (Any value for a child)

每个有子节点的 TreeNode 需要保存为一个元素,每个没有子节点的 TreeNode 需要保存为其父 TreeNode 的属性

这意味着上面的结果将生成以下 xml:

<?xml version="1.0" encoding="utf-8"?>
<Parent Child1="Any value">
  <Child2 Child1="Any value for a child" />
</Parent>

我尝试使用以下代码,但是当没有子节点的 TreeNodes 位于有子节点的 TreeNodes 下方时,它不起作用,并且我无法真正找到一个好的方法。

    public void SerializeTreeView(TreeView treeView, string fileName)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;

        XmlWriter textWriter = XmlWriter.Create(fileName, settings);

        // Writing the xml declaration tag
        textWriter.WriteStartDocument();

        // Save the nodes, recursive method
        SaveNodes(treeView.Nodes, textWriter);

        // End the xml document
        textWriter.WriteEndDocument();
        textWriter.Close();
    }

    private void SaveNodes(TreeNodeCollection nodesCollection, XmlWriter textWriter)
    {
        for (int i = 0; i < nodesCollection.Count; i++)
        {
            TreeNode node = nodesCollection[i];

            if (node.Nodes.Count > 0)
            {
                textWriter.WriteStartElement(node.Name);
            }
            else
            {
                textWriter.WriteAttributeString(node.Name, "Attribute value");
            }

            if (node.Nodes.Count > 0)
                SaveNodes(node.Nodes, textWriter);

            if (node.Nodes.Count > 0)
                textWriter.WriteEndElement();
        }
    }

编辑:

当前代码的问题是,如果我添加一个具有任何子级的 TreeNode 并且位于没有子级的 TreeNode 之上,则会出现以下错误:

Token StartAttribute in state Element Content would result in an invalid XML document.

这发生在:

textWriter.WriteAttributeString(node.Name, "Attribute value");

我通过按子节点计数对 TreeView 进行排序来解决这个问题(这意味着没有子节点的 TreeNode 将始终位于没有子节点的 TreeNode 下面)

该解决方案有效,但我想弄清楚为什么会出现错误以及如何修复它。

最佳答案

你如何填充TreeView?您实际上是给出对象键还是只是标题?尝试将两次出现的“node.Name”替换为“node.Text”(并且,出于代码完整性的原因,重构对 Count > 0 的多次检查):

编辑:好的,试试这个:

    private void SaveNodes(TreeNodeCollection nodesCollection, XmlWriter textWriter)
    {
        foreach (var node in nodesCollection.OfType<TreeNode>().Where(x => x.Nodes.Count == 0))
            textWriter.WriteAttributeString(node.Name, "Attribute value");

        foreach (var node in nodesCollection.OfType<TreeNode>().Where(x => x.Nodes.Count > 0))
        {
            textWriter.WriteStartElement(node.Name);
            SaveNodes(node.Nodes, textWriter);
            textWriter.WriteEndElement();
        }
    }

关于c# - 将 TreeView 保存为带有属性和元素的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16565269/

相关文章:

c# - 命名空间前缀 "system"未定义

c# - 字符串中只允许单一类型的标记

PHP DOMDocument appendChild 到根目录末尾

Xml 架构扩展顺序

winforms - 需要帮助将具有透明背景的图像设置到剪贴板

c# - ASCII 比较和字符串比较的区别

c# - 更改继承属性的类型(到继承类型)

java - 如何在 Spring 集成中将 XML JMS 消息发送到 FTP

c# - C#中的单击和双击事件不起作用

c# - 同时播放两种声音