使用任意嵌套XML将XML反序列化为C#对象

时间:2018-12-17 16:43:37

标签: c# xml

因此,我已尽力进行了搜索,但是找不到我遇到的确切问题。

这是我的嵌套XML:

<Message>
    <Foo>
        <Bar>1</Bar>
        <Baz>2</Baz>
        <Qux>3</Qux>
    </Foo>
</Message>

我在C#中有一个课:

[Serializable()]
[XmlRoot("Message")]
public class Foo
{
    [XmlElement("Bar")]
    public string Bar { get; set; }
    [XmlElement("Baz")]
    public string Baz { get; set; }
    [XmlElement("Qux")]
    public string Qux { get; set; }
}

现在,消息是任意的,并且随每个XML消息一起发送。因此,每个发送的XML消息周围都会带有一个<Message>标签。当我将Foo设置为XmlRoot时会引发错误,而将Message设置为XmlRoot时将无法识别子元素。我正在寻找一个干净且容易的解决方案。谢谢!

2 个答案:

答案 0 :(得分:1)

我还没有测试过,但是应该可以。

[Serializable()]
[XmlRoot("Message")]
public class Message
{
    [XmlElement("Foo")]
    public Foo Foo { get; set; }
}

[Serializable()]
public class Foo
{
    [XmlElement("Bar")]
    public string Bar { get; set; }
    [XmlElement("Baz")]
    public string Baz { get; set; }
    [XmlElement("Qux")]
    public string Qux { get; set; }
}

答案 1 :(得分:1)

在此处link

使用正确的模型

之后,您可以使用以下方法进行序列化和反序列化:

    public static class XMLFactory
{
    public static T XmlDeserializeFromString<T>(this string objectData)
    {
        return (T)XmlDeserializeFromString(objectData, typeof(T));
    }
    public static object XmlDeserializeFromString(this string objectData, Type type)
    {
        try
        {
            var serializer = new XmlSerializer(type);
            object result;

            using (TextReader reader = new StringReader(objectData))
            {
                result = serializer.Deserialize(reader);
            }

            return result;
        }
        catch (Exception ex)
        {
            LoggerHelper.LogError(ex.ToString());
            return null;
        }
    }
    public static string XmlSerializeToString(this object objectInstance)
    {
        var serializer = new XmlSerializer(objectInstance.GetType());
        var sb = new StringBuilder();

        using (TextWriter writer = new StringWriter(sb))
        {
            serializer.Serialize(writer, objectInstance);
        }

        return sb.ToString();
    }
}