2016-10-16 21 views
0

xmlにオブジェクトのリストをシリアライズするc#プロジェクトがあります。XMLシリアル化に再帰的なフォルダ構造を追加する

[Serializable] 
[XmlRoot] 
public class collection { 
    private List<item> _items = new List<item>(); 

    [XmlElement("item")] 
    public List<item> items { 
     get { return _items; } 
    } 
} 

[Serializable] 
    public class item { 
} 

xml出力は、私が好きだろうか、その後

<collection> 
    <item/> 
    <item/> 
    <item/> 
</collection> 

でまだルートノードに行くことができながらアイテムをまとめてグループ化することができますので、フォルダ&サブフォルダのオプションを追加することです。

<collection> 
    <item/> 
    <item/> 
    <folder> 
     <item/> 
     <item/> 
    </folder> 
    <item/> 
    <item/> 
    <folder> 
     <item/> 
     <item/> 
     <folder> 
      <item/> 
      <item/> 
     </folder> 
    </folder> 
    <item/> 
</collection> 

シリアル化されたオブジェクトを使用してxml出力を生成し続けている間、これを行うためのきれいな方法は誰にでも助言できますか?

+0

あなたはアイテムの代わりにフォルダを使用して解析する必要があります。あなたはアイテムの親を得ることができますが、私は個人的に親プロパティを使うのが好きではありません。 – jdweng

答えて

0

これは、クラス構造でなければなりません。

public class Folder2 
{ 
} 

public class Folder 
{ 
    public Folder2 folder { get; set; } 
} 

public class Collection 
{ 
    public List<Folder> folder { get; set; } 
} 

public class RootObject 
{ 
    public Collection collection { get; set; } 
} 
+0

これを見ると、フォルダーを必須(オプションではなく)にし、常に2レベルの深さに固定すると思います。 – user2921789

+0

オプション属性を使用できます –

0

少し試行錯誤して、私は後に機能しました。所望の出力を生成

[Serializable] 
[XmlRoot] 
public class collection { 
    private List<treeEntry> _entries = new List<treeEntry>(); 

    [XmlElement("item", typeof(item))] 
    [XmlElement("folder", typeof(folder))] 
    public List<treeEntry> entries { 
     get { return _entries; } 
    } 
} 

public abstract class treeEntry { } 

[Serializable] 
public class folder : treeEntry { 
    private List<treeEntry> _entries = new List<treeEntry>(); 

    public folder() { } 

    [XmlAttribute] 
    public string name { get; set; } 

    [XmlElement("item", typeof(item))] 
    [XmlElement("folder", typeof(folder))] 
    public List<treeEntry> entries { 
     get { return _entries; } 
    } 
} 


[Serializable] 
public class item : treeEntry { } 


public class mytest { 
    public static void main() { 
     collection col = new collection(); 
     col.entries.Add(new item()); 
     col.entries.Add(new item()); 

     var folder1 = new folder() { name = "someFolder" }; 
     folder1.entries.Add(new item()); 
     var folder2 = new folder() { name = "anotherFolder" }; 
     folder1.entries.Add(folder2); 
     folder1.entries.Add(new item()); 
     folder2.entries.Add(new item()); 

     col.entries.Add(folder1); 
     col.entries.Add(new folder()); 
     col.entries.Add(new item()); 


     XmlSerializer sers = new XmlSerializer(typeof(collection)); 

     //serialise 
     using (StreamWriter sw = new StreamWriter("testoutput.xml", false, Encoding.UTF8)) { 
      XmlWriter xw = new XmlTextWriter(sw); 
      sers.Serialize(xw, col); 
     } 

     //deserialise 
     FileStream fs = new FileStream("testoutput.xml", FileMode.Open); 
     XmlReader reader = XmlReader.Create(fs); 
     collection newcol = (collection)sers.Deserialize(reader); 

     //output to console 
     sers.Serialize(Console.Out, newcol); 
    } 
} 

<collection> 
    <item /> 
    <item /> 
    <folder name="someFolder"> 
     <item /> 
     <folder name="anotherFolder"> 
      <item /> 
     </folder> 
     <item /> 
    </folder> 
    <folder /> 
    <item /> 
</collection> 
関連する問題