2013-05-15 35 views
2

我有一個需要保存爲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下)

解決方案有效,但我想弄清楚爲什麼發生錯誤以及如何要解決這個問題。

+0

任何不考慮linq2xml的原因! – Anirudha

+1

由於XmlWriter太糟糕而發生錯誤。它在文本流中寫入,並且不會返回,因此只能在「WriteStartElement」之後添加屬性。 – svinja

+0

謝謝,那個工作。非常漂亮的代碼btw :) – Dumpen

回答

3

你是如何填充TreeView的?你真的在給對象鍵還是隻是標題?嘗試更換「node.Name」與「node.Text」的兩個OCCURENCES(並且,對於碼理智的原因,對於重構計數> 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(); 
     } 
    } 
+0

通過閱讀XML文件並在該XML文件中查找子節點來填充TreeView。這意味着每個TreeNode都有兩個我使用的屬性,Name和Text。名稱被設置爲元素名稱,文本被設置爲元素名稱,但被格式化(含義「這是我的元素」將顯示爲「這是我的元素」。當我保存xml文檔時,TreeNode然後使用名稱作爲元素名稱 – Dumpen

+0

然後出現什麼問題?「但是當沒有子節點的TreeNodes在子節點的下面時,它不起作用」它是如何工作的?發生了什麼?代碼與你的例子一起工作在你的問題中給出了...... – svinja

+0

啊,我知道了 - 未來的一個提示 - 發佈一個導致問題的例子,而不是一個正常工作的例子,我更新了我的答案 – svinja