2013-08-23 36 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它爲我工作得很好,匹配所有的值到正確的地方。 –