2017-07-18 101 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

谢谢你,我用您的解决方案它完美的工作 - 不知道这是怎么一个人滑过我的注意力;)你是完全正确的信用类型,我已经改变了它的职位。再次感谢! –

相关问题