如何使用.NET将复杂对象反序列化为flat

时间:2013-01-28 16:23:16

标签: c# .net deserialization xml-deserialization

我有XML:

<root>
  <prop1>value1</prop1>
  <prop2>value2</prop2>
  <data>
    <prop3>value3</prop3>
    <prop4>value4</prop4>
  <data>
</root>

我希望将其反序列化为如下对象:

class xyz
{
    string prop1;
    int prop2;
    string prop3;
    int prop4;
}

我应该如何用XmlElement - 属性?

标记prop2和prop3

2 个答案:

答案 0 :(得分:3)

您可以使用Linq 2 Xml(假设您修复了xml并将public添加到字段定义中)

var xDoc = XDocument.Parse(xml); // XDocument.Load(filename);
var x = new xyz()
    {  
        prop1 = xDoc.Root.Element("prop1").Value,
        prop2 = (int)xDoc.Root.Element("prop2"),
        prop3 = xDoc.Root.Element("data").Element("prop3").Value,
        prop4 = (int)xDoc.Root.Element("data").Element("prop4"),
    };

答案 1 :(得分:1)

我会推荐这种方法:

[XmlRoot("root")]
[Serializable]
public class RootElement
{
    [XmlElement("prop1")]
    public string prop1 { get; set; }

    [XmlElement("prop2")]
    public string prop2 { get; set; }

    [XmlElement("data")]
    public DataElement data { get; set; }
}

[XmlRoot("data")]
[Serializable]
public class DataElement
{
    [XmlElement("prop3")]
    public string prop3 { get; set; }

    [XmlElement("prop4")]
    public string prop4 { get; set; }
}

var yourObject = (RootElement)new XmlSerializer(typeof(RootElement)).Deserialize("your xml goes here");

您可以像这样访问您的媒体资源:

yourObject.prop1
yourObject.prop2
yourObject.data.prop3
yourObject.data.prop4

如果你想将xml反序列化为扁平结构,我认为默认情况下不可能。您可以编写自己的IXmlSerializable实现,或者更好地覆盖XmlSerializer的一些方法。