我有一个需要保存为 xml 文件的 Windows 窗体 TreeView。
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)
该解决方案有效,但我想弄清楚错误发生的原因以及如何解决它。