2017-07-18 64 views
1

給定一個計數屬性和元素值的XML結構,如何使用System.Xml.Serialization屬性構造我的C#類?反序列化具有屬性和值的元素

我的XML看起來是這樣的:

<Accounts> 
    <Number credit="1000">100987654321</Number> 
    <Number credit="0" >100987654322</Number> 
<Accounts> 

我一直在試圖與此類結構,但它不接受XML。

public class Customer 
{ 
    [DataMember, XmlArrayItem(ElementName = "Accounts")] 
    public AccountNumber[] AccountNumbers; 
} 

public class AccountNumber 
{ 
     [DataMember, XmlElement(ElementName = "Number")] 
     public string AccountNumber; 

     [DataMember, XmlAttribute(AttributeName = "credit")] 
     public int Credit; 
} 

訣竅是沒有嵌套在「Number」元素中的數字數組。我們經常在例如。 html標籤,在這裏你有一個標籤與一些造型也許和該AccountNumber類可以被定義爲在

"... height=12px> value </..." 

回答

2

之間的實際值如下:

public class AccountNumber 
{ 
    [XmlText] 
    public string Number { get; set; } 

    [XmlAttribute(AttributeName = "credit")] 
    public int Credit { get; set; } 
} 

這導致屬性和元素文本被正確地反序列化。

PS。我不得不將AccountNumber更改爲Number,因爲否則它將不會編譯,並且Credit屬性DateTimeint作爲屬性的值顯然不是日期/時間。

你可能有解決您的Customer課呢,我用下面來進行測試:

[XmlRoot("Accounts")] 
public class Accounts 
{ 
    [XmlElement(ElementName = "Number")] 
    public AccountNumber[] AccountNumbers; 
} 

並且測試「方案」本身:

static void Main(string[] args) 
{ 
    string str = @"<Accounts><Number credit=""1000"">100987654321</Number><Number credit=""0"">100987654322</Number></Accounts>"; 

    using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(str))) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(Accounts)); 
     var result = (Accounts)ser.Deserialize(stream); 
    } 
} 
+0

謝謝你,我用您的解決方案它完美的工作 - 不知道這是怎麼一個人滑過我的注意力;)你是完全正確的信用類型,我已經改變了它的職位。再次感謝! –

相關問題