C# 使用属性和元素将TreeView另存为xml

C# 使用属性和元素将TreeView另存为xml,c#,xml,winforms,recursion,treenode,C#,Xml,Winforms,Recursion,Treenode,我有一个Windows窗体树视图,需要保存为xml文件 TreeView的结构如下所示: - Parent - Child 1 (Any value) - Child 2 - Child 1 (Any value for a child) 每个有子节点的树节点都需要保存为元素,每个没有子节点的树节点都需要保存为其父树节点的属性 这意味着上述操作将产生以下xml: <?xml version="1.0" encoding="utf-8"?> <Parent C

我有一个Windows窗体树视图,需要保存为xml文件

TreeView的结构如下所示:

 - Parent
  - Child 1 (Any value)
  - Child 2
    - Child 1 (Any value for a child)
每个有子节点的树节点都需要保存为元素,每个没有子节点的树节点都需要保存为其父树节点的属性

这意味着上述操作将产生以下xml:

<?xml version="1.0" encoding="utf-8"?>
<Parent Child1="Any value">
  <Child2 Child1="Any value for a child" />
</Parent>
这种情况发生在:

textWriter.WriteAttributeString(node.Name, "Attribute value");
我通过按子节点计数对TreeView排序来解决这个问题(这意味着没有子节点的TreeNode将始终低于没有子节点的TreeNode)


解决方案是可行的,但我想弄清楚为什么会发生错误以及如何修复它。

您如何填写树视图?你是真的给了对象键还是只给了标题?尝试将出现的两个“node.Name”替换为“node.Text”(并且,出于代码健全的原因,重构计数>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();
        }
    }
私有void存储节点(TreeNodeCollection节点集合,XmlWriter textWriter)
{
foreach(nodesCollection.OfType()中的var节点,其中(x=>x.Nodes.Count==0))
textWriter.WriteAttributeString(node.Name,“属性值”);
foreach(nodesCollection.OfType()中的var节点,其中(x=>x.Nodes.Count>0))
{
textWriter.WriteStarteElement(node.Name);
保存节点(node.Nodes、textWriter);
textWriter.WriteEndElement();
}
}

任何不考虑linq2xml的原因!发生错误的原因是XmlWriter糟糕透顶。它以文本流的形式写入,并且不会返回,因此您只能在“WriteStarteElement”之后添加属性。谢谢,这样做了。非常流畅的代码顺便说一下:)树视图是通过读取xml文件并查找该xml文件中的子节点来填充的。这意味着每个树节点都有两个我使用的属性:名称和文本。名称设置为元素名称,文本设置为元素名称,但已格式化(意思是“这是我的元素”将显示为“这是我的元素”)。当我保存xml文档时,树节点名称将用作元素名称。那么有什么错?“但是当树节点没有孩子的时候,树节点下面有孩子的时候,它就不起作用了。”“它是怎么不起作用的?发生了什么事?代码与您在问题中给出的示例一致…啊,我得到了它-未来的提示-发布一个导致问题的示例,而不是一个运行良好的示例。我更新了我的答案。谢谢,对于不可靠的解释,我感到抱歉。我在我的帖子中添加了一个编辑,可以解释发生了什么。
textWriter.WriteAttributeString(node.Name, "Attribute value");
    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();
        }
    }