当前位置: 首页 > 知识库问答 >
问题:

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

诸葛嘉熙
2023-03-14

我有一个Windows窗体树视图,需要保存为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>

我试着使用下面的代码,但当树节点没有孩子,树节点下面有孩子,我真的想不出一个好方法时,它就不起作用了。

    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)

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

共有1个答案

贺景胜
2023-03-14

你怎么填树景的?你是真的给了对象键还是只给了标题?尝试用“node.Text”替换出现的两个“node.Name”(并且,出于代码健全的原因,重构多个计数检查)

编辑:好的,试试这个:

    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();
        }
    }
 类似资料:
  • 问题内容: 我做了一个语法荧光笔,我希望有一个选项另存为PDF。我已经看了这个SO问题,但是下载它并不能保留CSS样式,这会破坏下载突出显示的文件的意义。有什么方法可以在维护CSS的同时将元素另存为PDF? HTML: JS: 您可能已经注意到,如果要这样做,我正在使用jQuery。 问题答案: 尝试打开新的,追加 ,如果任何的元素,以新颖 ,呼吁,在新的; 选择系统打印对话框,选择“打印到文件”

  • 问题内容: 我正在使用Java解析Xml,我想在属性值的帮助下解析元素。 例如 在这种情况下,我想使用att值解析tag1数据。我是java和xml的新手。请引导我。 问题答案: 有多种方法可以做到这一点。您可以使用xPath(示例),DOM Document或SAX Parser(示例)来检索属性值和标记元素。 这是您要求的解决方法。我从不建议使用“ hack”类型,而是使用SAX(请参见示例链

  • 在使用Vdt的过程中,你也许会遇到这样一个问题:设置的属性,并不能渲染出来,例如: <input maxlength="10" /> 上述例子中,设置的maxlength属性丢失了。要理解这个原因,可以看看这段介绍 Content attribute & IDL attribute, 以及Virtual-Dom文档中对VNode的介绍 Content vs IDL attribute Conte

  • 我有一个XML模式,它说: 这意味着我必须能够创建一个如下所示的实例:

  • 我想将属性文件中的内容显示为json数组:以下是我的java代码: 我在属性文件中得到了什么: 这是我想要的 我尝试使用Gson和JsonObject,但没有成功。请问我该怎么办?这不是一个重复的问题,因为我正在使用properties类,并且我已经尝试过的建议答案不起作用。

  • 问题内容: 因此,如果有一个链接到网页的css文件,例如: 并且我想读取某个属性,例如div具有className =’layout’,并且我想使用JavaScript读取此属性的详细信息,我该怎么做? 我搜索了很多,但几乎没有运气,请提出建议。 问题答案: 您有两种选择: 手动枚举和解析对象(不建议使用,除非您要获取由某个选择器定义的所有特定样式属性)。 创建与选择器匹配的元素,然后使用或(IE