使用c#中的复杂元素进行Xml反序列化

时间:2013-08-23 18:56:23

标签: c# xml

我的xml字符串反序列化到我的对象时遇到了一些麻烦。我没有收到任何错误,但是值没有填充(值不是null它们只是"")。我已经查看了几个有相同问题的问题,但这些问题通常包括没有定义[XmlRoot][XmlElement]的人。

这是我的一些xml字符串:

string xmlString = @"<results><dpv_answer value=""Y"" /><zip value=""95118-4007"" /></results>"

以下是deseralize的功能:

StandardAddress address = new StandardAddress();

using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
{
    try
    {
        address = (StandardAddress)new XmlSerializer(typeof(StandardAddress)).Deserialize(reader);
    }
    catch (InvalidOperationException x)
    {
        // String passed is not XML, simply return defaultXmlClass
    }
}

return address;

这是一个对象声明:

[XmlRoot("results")]
public class StandardAddress
{
    [XmlElement(ElementName = "dpv_answer")]
    public string dpv_answer { get; set; }
    [XmlElement(ElementName = "zip")]
    public string zip { get; set; }
}

2 个答案:

答案 0 :(得分:4)

dpv_answerzip是复杂元素,而不仅仅是字符串。请尝试以下方法:

[XmlRoot("results")]
public class StandardAddress
{
    [XmlElement(ElementName = "dpv_answer")]
    public dpv_answer dpv_answer { get; set; }

    [XmlElement(ElementName = "zip")]
    public zip zip { get; set; }
}

public class dpv_answer
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}


public class zip
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

答案 1 :(得分:3)

您的每个元素都具有您尝试从中获取值的属性。此外,属性是相同的,因此,如fcuesta建议的那样,您可以使用单个类,而不是具有多个可序列化类,如下所示:

[XmlRoot("results")]
public class StandardAddress
{
    [XmlElement(ElementName = "dpv_answer")]
    public Element DpvAnswer { get; set; }

    [XmlElement(ElementName = "zip")]
    public Element Zip { get; set; }
}

public class Element
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

这适用于相似的元素,这可能很有用。但是如果你打算在未来将你的元素改为他们自己独特的模式,他们将需要分开,正如fcuesta所建议的那样。