Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化xmlarray的xml属性_C#_Xml - Fatal编程技术网

C# 反序列化xmlarray的xml属性

C# 反序列化xmlarray的xml属性,c#,xml,C#,Xml,我知道你不能给XmlArray添加一个属性,我认为这很不方便。我知道我可以为Phone创建一个单独的类,但是Phone属于Access。我还有大约30个节点在访问中。如何反序列化属性hasTextField <Access> <Phone hasTextField="true"> <Item description="Skype" /> <Item description="IP Phone"

我知道你不能给XmlArray添加一个属性,我认为这很不方便。我知道我可以为Phone创建一个单独的类,但是Phone属于Access。我还有大约30个节点在访问中。如何反序列化属性hasTextField

    <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);
}