将类序列化为扁平XML

时间:2017-05-09 00:16:32

标签: c# xml serialization

本质上,我需要将C#对象序列化为xml文档,该文档具有完全不同的xml结构和不同的类/节点名称。 C#类的结构是:

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>

但我需要将其序列化为:

<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>

我目前正在使用IXmlSerializable来尝试指定架构。这样做的最佳方式是什么?我应该转换为第二个自定义对象吗?

1 个答案:

答案 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();
    }
}