C# 反序列化xmlarray的xml属性
我知道你不能给XmlArray添加一个属性,我认为这很不方便。我知道我可以为Phone创建一个单独的类,但是Phone属于Access。我还有大约30个节点在访问中。如何反序列化属性hasTextFieldC# 反序列化xmlarray的xml属性,c#,xml,C#,Xml,我知道你不能给XmlArray添加一个属性,我认为这很不方便。我知道我可以为Phone创建一个单独的类,但是Phone属于Access。我还有大约30个节点在访问中。如何反序列化属性hasTextField <Access> <Phone hasTextField="true"> <Item description="Skype" /> <Item description="IP Phone"
<Access>
<Phone hasTextField="true">
<Item description="Skype" />
<Item description="IP Phone" />
</Phone>
<Computer>
<Item description="PC" />
<Item description="Laptop" />
</Computer>
</Access>
[XmlRoot("Access")]
public class Access
{
public Access(){}
[XmlArray("Phone")]
[XmlArrayItem("Item")]
public AccessItem[] ItemList;
[XmlArray("Computer")]
[XmlArrayItem("Item")]
public AccessItem[] ItemList;
}
[XmlRoot(“访问”)]
公共类访问
{
公共访问(){}
[XmlArray(“电话”)]
[XmlArrayItem(“项目”)]
公共访问项[]项列表;
[XmlArray(“计算机”)]
[XmlArrayItem(“项目”)]
公共访问项[]项列表;
}
您可以将XmlArray
替换为xmlement
见:
[XmlType(“访问”)]
公共类访问
{
[XmlElement(“电话”)]
公共访问项电话{get;set;}
[XmlElement(“计算机”)]
公共访问项计算机{get;set;}
}
公共类访问项
{
公共访问项()
{
项目=新列表();
}
[XmlAttribute(“hasTextField”)]
公共bool HasTextField{get;set;}
[XmlElement(“项目”)]
公共列表项{get;set;}
}
[XmlType(“项目”)]
公共类项目
{
[XmlAttribute(“说明”)]
公共字符串说明{get;set;}
}
代码:
var data=@”
";
var serializer=新的XmlSerializer(typeof(Access));
准入;
使用(变量流=新的StringReader(数据))
使用(var reader=XmlReader.Create(stream))
{
access=(access)序列化程序。反序列化(读取器);
}
您可以将XmlArray
替换为xmlement
见:
[XmlType(“访问”)]
公共类访问
{
[XmlElement(“电话”)]
公共访问项电话{get;set;}
[XmlElement(“计算机”)]
公共访问项计算机{get;set;}
}
公共类访问项
{
公共访问项()
{
项目=新列表();
}
[XmlAttribute(“hasTextField”)]
公共bool HasTextField{get;set;}
[XmlElement(“项目”)]
公共列表项{get;set;}
}
[XmlType(“项目”)]
公共类项目
{
[XmlAttribute(“说明”)]
公共字符串说明{get;set;}
}
代码:
var data=@”
";
var serializer=新的XmlSerializer(typeof(Access));
准入;
使用(变量流=新的StringReader(数据))
使用(var reader=XmlReader.Create(stream))
{
access=(access)序列化程序。反序列化(读取器);
}
这是从xml文件读取的吗?您考虑过使用XmlReader吗?你可以选择以这种方式分配哪些属性。你可以用适当的属性装饰Phone和Computer类(=不要在列表中使用它们,而且它甚至不编译…)我相信这是重复的:@Kai它很相似,但是,那篇文章中的解决方案是创建一个新类,我不想这样做,因为我必须为每个节点创建一个类。这是从xml文件读取的吗?您考虑过使用XmlReader吗?你可以选择以这种方式分配哪些属性。你可以用适当的属性装饰Phone和Computer类(=不要在列表中使用它们,而且它甚至不编译…)我相信这是重复的:@Kai它很相似,但是,那篇文章中的解决方案是创建一个新类,我不想这样做,因为我必须为每个节点创建一个类。很好,只要将计算机更改为计算机,将电话更改为电话:)是的,我没有注意到。我还将字段更改为属性。谢谢!使用XmlElement非常好,我想到了,但不知道如何编码。很好,把电脑换成电脑,把电话换成电话:)是的,我没注意到。我还将字段更改为属性。谢谢!使用XmlElement非常好,我想到了它,但就是不知道如何编写代码。
[XmlType("Access")]
public class Access
{
[XmlElement("Phone")]
public AccessItem Phone { get; set; }
[XmlElement("Computer")]
public AccessItem Computer { get; set; }
}
public class AccessItem
{
public AccessItem()
{
Items = new List<Item>();
}
[XmlAttribute("hasTextField")]
public bool HasTextField { get; set; }
[XmlElement("Item")]
public List<Item> Items { get; set; }
}
[XmlType("Item")]
public class Item
{
[XmlAttribute("description")]
public string Description { get; set; }
}
var data = @"<Access>
<Phone hasTextField=""true"">
<Item description=""Skype"" />
<Item description=""IP Phone"" />
</Phone>
<Computer>
<Item description=""PC"" />
<Item description=""Laptop"" />
</Computer>
</Access>";
var serializer = new XmlSerializer(typeof(Access));
Access access;
using(var stream = new StringReader(data))
using(var reader = XmlReader.Create(stream))
{
access = (Access)serializer.Deserialize(reader);
}