使用属性和值

时间:2017-07-18 14:11:49

标签: c# attributes xml-serialization

如果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;
}

诀窍是没有一个数字数组嵌套在&#34;数字&#34;元件。我们经常在例如看到这个结构。 html标签,你可能有一些带有某些样式的标签,以及

之间的实际值
"... height=12px> value </..."

1 个答案:

答案 0 :(得分:4)

AccountNumber类可以定义如下:

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

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

这会导致正确地反序列化属性和元素文本。

PS。我必须将AccountNumber更改为Number,因为否则无法编译,Credit属性从DateTime更改为int作为属性的值清楚不是日期/时间。

您可能还必须修复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);
    }
}