我有一個需要保存爲xml文件的Windows窗體TreeView。將TreeView作爲xml保存爲屬性和元素
TreeView中的結構是這樣的:
- Parent
- Child 1 (Any value)
- Child 2
- Child 1 (Any value for a child)
每一個樹節點有孩子需要被保存爲一個元素,並且需要它保存爲一個屬性,每一個沒有孩子的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下)
解決方案有效,但我想弄清楚爲什麼發生錯誤以及如何要解決這個問題。
任何不考慮linq2xml的原因! – Anirudha
由於XmlWriter太糟糕而發生錯誤。它在文本流中寫入,並且不會返回,因此只能在「WriteStartElement」之後添加屬性。 – svinja
謝謝,那個工作。非常漂亮的代碼btw :) – Dumpen