2013-08-23 116 views
1

我对我的xml字符串反序列化到我的对象有一些麻烦。我没有得到任何错误,但值不填充(值不是null他们只是"")。我查看了几个具有相同问题的问题,但这些问题通常由没有定义[XmlRoot]或的人员组成。Xml使用c中的复杂元素进行反序列化#

这里有点我的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; } 
} 
+0

你有一个空的'catch {}'处理程序,你可能会得到错误但不知道它? – Alfie

+0

我正在逐步使用调试器,我不会进入catch块。 –

+0

无题评论:最好用空格而不是制表符缩进你的代码。 – BartoszKP

回答

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; } 
} 
+0

这工作,谢谢。 –

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所建议的那样。

+0

是的,我可能会按照你的建议去做'Element'类。然后切断很多代码。谢谢。 –

+0

@Brett在做之前阅读我的评论。 –

+0

@YairNevet它为我工作得很好,匹配所有的值到正确的地方。 –