反序列化具有属性和值的元素
Deserializing elements with both attributes and value
给定一个包含属性和元素值的 XML 结构,我如何使用 System.Xml.Serialization 属性构建我的 C# classes?
我的 XML 看起来像这样:
<Accounts>
<Number credit="1000">100987654321</Number>
<Number credit="0" >100987654322</Number>
<Accounts>
我一直在尝试使用这种 class 结构,但它不接受 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" 元素中嵌套数字数组。我们经常在 eg 中看到这个结构。 html 标签,其中您的标签可能带有一些样式,而实际值介于
之间
"... height=12px> value </..."
AccountNumber
class可以定义如下:
public class AccountNumber
{
[XmlText]
public string Number { get; set; }
[XmlAttribute(AttributeName = "credit")]
public int Credit { get; set; }
}
这会导致正确反序列化属性和元素文本。
PS。我不得不将 AccountNumber
更改为 Number
,因为否则它将无法编译,并且 Credit
属性 从 DateTime
更改为 int
作为值的属性显然不是 dates/times.
您可能还需要修复 Customer
class,我使用以下方法进行测试:
[XmlRoot("Accounts")]
public class Accounts
{
[XmlElement(ElementName = "Number")]
public AccountNumber[] AccountNumbers;
}
和测试 "program" 本身:
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);
}
}
给定一个包含属性和元素值的 XML 结构,我如何使用 System.Xml.Serialization 属性构建我的 C# classes?
我的 XML 看起来像这样:
<Accounts>
<Number credit="1000">100987654321</Number>
<Number credit="0" >100987654322</Number>
<Accounts>
我一直在尝试使用这种 class 结构,但它不接受 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" 元素中嵌套数字数组。我们经常在 eg 中看到这个结构。 html 标签,其中您的标签可能带有一些样式,而实际值介于
之间"... height=12px> value </..."
AccountNumber
class可以定义如下:
public class AccountNumber
{
[XmlText]
public string Number { get; set; }
[XmlAttribute(AttributeName = "credit")]
public int Credit { get; set; }
}
这会导致正确反序列化属性和元素文本。
PS。我不得不将 AccountNumber
更改为 Number
,因为否则它将无法编译,并且 Credit
属性 从 DateTime
更改为 int
作为值的属性显然不是 dates/times.
您可能还需要修复 Customer
class,我使用以下方法进行测试:
[XmlRoot("Accounts")]
public class Accounts
{
[XmlElement(ElementName = "Number")]
public AccountNumber[] AccountNumbers;
}
和测试 "program" 本身:
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);
}
}