2017-05-09 11 views
0

本質的には、全く異なるxml構造と異なるクラス/ノード名を持つxmlドキュメントにC#オブジェクトをシリアル化する必要があります。 C#クラスの構造は次のとおりです。クラスをフラットなXMLにシリアライズ

public class Root 
    { 
    public item item {get; set} 
    } 

public class item 
    { 
    public string name {get; set} 
    public color[] color 
    }  

public class color 
    { 
    public string itemColor {get; set} 
    } 

私たちの商品は車です。これは

<Root> 
    <item> 
     <name>car</name> 
     <color> 
      <itemColor>red</itemColor> 
      <itemColor>blue</itemColor> 
      <itemColor>gree</itemColor> 
     </Color> 
    </item> 
</Root> 

にシリアライズしかし、私は、これはにシリアライズする必要があります:私は現在、試してみて、スキーマを指定するには、IXmlSerializableを使用してい

<Root> 
    <item> 
     <name>car</name> 
     <itemColor>red</itemColor> 
    </item> 
     <name>car</name> 
     <itemColor>blue</itemColor> 
    </item> 
    <item> 
     <name>car</name> 
     <itemColor>green</itemColor> 
    </item> 
</Root> 

。これを行う最適な方法は何ですか? 2番目のカスタムオブジェクトに変換する必要がありますか?

+0

手動でDOM xmlの書き込みを検討しますか? –

+0

あなたが持っている現在のモデルを変更するか、出力に合った新しいモデルにコピーします –

答えて

1

これを試してみてください:

public class Root 
{ 
    [XmlIgnore] 
    public item item { get; set; } 

    [EditorBrowsable(EditorBrowsableState.Never)] 
    [XmlAnyElement("item")] 
    public List<XElement> _item 
    { 
     get 
     { 
      return item.color.Select(i => 
       new XElement("item", 
        new XElement("name", item.name), 
        new XElement("itemColor", i.itemColor) 
       )).ToList(); 
     } 
    } 
} 

public class item 
{ 
    public string name { get; set; } 
    public color[] color; 
} 

public class color 
{ 
    public string itemColor { get; set; } 
} 

また、ハードコードされたリテラルの代わりにnameofを使う方が良いでしょう。

[XmlAnyElement(nameof(item))] 
public List<XElement> _item 
{ 
    get 
    { 
     return item.color.Select(i => 
      new XElement(nameof(item), 
       new XElement(nameof(item.name), item.name), 
       new XElement(nameof(i.itemColor), i.itemColor) 
      )).ToList(); 
    } 
} 
関連する問題