【问题标题】:How to deserialize complex object into flat using .NET如何使用 .NET 将复杂对象反序列化为平面
【发布时间】:2013-01-28 16:23:15
【问题描述】:

我有类似的 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-Attribute 标记prop2 和prop3?

【问题讨论】:

  • 您是否可以控制 XML 格式/架构?如果您的数据符合模式,则可以研究 XML 序列化技术。
  • 反序列化会是一个overkill..使用linq2xml
  • 不,我没有。给出了 XML 模式。 :-(
  • 我试图重写 XmlSerializer 以便能够使用 xPath 作为 XmlElement 属性的参数。但我在实施中迷失了方向。这并不像我预期的那么容易。

标签: c# .net deserialization xml-deserialization


【解决方案1】:

您可以为此使用 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"),
    };

【讨论】:

  • 是的,我可以,但想象一下,有成千上万的属性。在这个解决方案中,代码会很长。但它确实有效。
【解决方案2】:

我会推荐这种方法:

[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 的某些方法。

【讨论】:

  • 我想避免这种情况。我只想有一个扁平结构的对象。有更多的嵌套部分,这将导致许多对象的实现。
  • OP 在他的问题标题中明确提到他想反序列化为“平面”对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多