Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# xml C中的数组反序列化#_C#_Xml_Serialization - Fatal编程技术网

C# xml C中的数组反序列化#

C# xml C中的数组反序列化#,c#,xml,serialization,C#,Xml,Serialization,我有这个Xml <Facility ID="353"> <Name>Test</Name> <Buildingtype>Test</Buildingtype> <SMSInfoID> <ID default="True">140</ID> <ID default="True">140</ID> <ID defau

我有这个Xml

<Facility ID="353">
    <Name>Test</Name>
    <Buildingtype>Test</Buildingtype>
    <SMSInfoID>
      <ID default="True">140</ID>
      <ID default="True">140</ID>
      <ID default="True">140</ID>
    </SMSInfoID>
  </Facility>

试验
试验
140
140
140
我对取消标签的使用有问题

我已经尝试了很多方法来解决它,这是我上一次测试的结果,但仍然无法访问该元素中的数据

public class Facility
    {     
        [XmlAttribute("ID"), Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }

        [XmlElement("Buildingtype")]
        public string CategoryID { get; set; }

        [XmlElement("Name")]
        public string Name { get; set; }

        [XmlElement("SMSInfoID")]
        public virtual SMSInfoID SMSInfoID { get; set; }       
    }

[XmlRoot("SMSInfoID")]
    public class SMSInfoID
    {
        [XmlIgnore, Key]
        public int Id { get; set; }

        [XmlElement("ID")]
        public  List<ID> ID { get; set; }        
    }



[XmlRoot("ID")]
    public  class ID
    {
        [Key]
        public int Id { get; set; }
        [XmlAttribute("default")]
        public string Default { get; set; }
    }
公共类设施
{     
[XmlAttribute(“ID”),键,DatabaseGenerated(DatabaseGenerateOption.None)]
公共int Id{get;set;}
[XmlElement(“Buildingtype”)]
公共字符串CategoryID{get;set;}
[XmlElement(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“SMSInfoID”)]
公共虚拟SMSInfoID SMSInfoID{get;set;}
}
[XmlRoot(“SMSInfoID”)]
公共类SMSInfoID
{
[XmlIgnore,Key]
公共int Id{get;set;}
[XmlElement(“ID”)]
公共列表ID{get;set;}
}
[XmlRoot(“ID”)]
公共类ID
{
[关键]
公共int Id{get;set;}
[XmlAttribute(“默认值”)]
公共字符串默认值{get;set;}
}

谁能帮我解决这个问题

如果您没有使用SMSInfoID的Id,您可以将其重写为Facility的属性:

[XmlArray("SMSInfoID")]
[XmlArrayItem("ID")]
public List<ID> ID { get; set; } 
[XmlArray(“SMSInfoID”)]
[XmlArrayItem(“ID”)]
公共列表ID{get;set;}
或将此属性包装为XML:

[XmlArray("SMSInfoID")]
[XmlArrayItem("ID")]
public List<ID> ID 
{ 
    get {return SMSInfoID.ID;} 
    set {SMSInfoID.ID = value; 
} 

[XmlIgnore]
public virtual SMSInfoID SMSInfoID { get; set; } 
[XmlArray(“SMSInfoID”)]
[XmlArrayItem(“ID”)]
公共列表ID
{ 
获取{return SMSInfoID.ID;}
设置{SMSInfoID.ID=value;
} 
[XmlIgnore]
公共虚拟SMSInfoID SMSInfoID{get;set;}

如果不可能,您可以/允许更改什么?

不要在XML中使用数组。数组会添加额外级别的标记。 下面的代码与xml匹配

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Facility facility = new Facility() {
                Id = 353,
                Name = "Test",
                CategoryID = "Test",
                SMSInfoID = new SMSInfoID() {
                        ID = new List<ID>() {
                            new ID() { _default = true, value = 140},
                            new ID() { _default = true, value = 140},
                            new ID() { _default = true, value = 140}
                        }
                    }
                };

            XmlSerializer serializer = new XmlSerializer(typeof(Facility));

            StreamWriter writer = new StreamWriter(FILENAME);
            serializer.Serialize(writer, facility);
            writer.Flush();
            writer.Close();
            writer.Dispose();

        }
    }
    public class Facility
    {
        [XmlAttribute("ID")]
        public int Id { get; set; }

        [XmlElement("Buildingtype")]
        public string CategoryID { get; set; }

        [XmlElement("Name")]
        public string Name { get; set; }

        [XmlElement("SMSInfoID")]
        public virtual SMSInfoID SMSInfoID { get; set; }
    }

    [XmlRoot("SMSInfoID")]
    public class SMSInfoID
    {

        [XmlElement("ID")]
        public List<ID> ID { get; set; }
    }
    [XmlRoot("ID")]
    public class ID
    {
        [XmlAttribute("default")]
        public Boolean _default {get; set;}
        [XmlText()]
        public int value { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
设施=新设施(){
Id=353,
Name=“Test”,
CategoryID=“测试”,
SMSInfoID=新SMSInfoID(){
ID=新列表(){
新ID(){u default=true,value=140},
新ID(){u default=true,value=140},
新ID(){u default=true,value=140}
}
}
};
XmlSerializer serializer=新的XmlSerializer(typeof(Facility));
StreamWriter writer=新的StreamWriter(文件名);
序列化器。序列化(编写器、工具);
writer.Flush();
writer.Close();
writer.Dispose();
}
}
公共类设施
{
[XmlAttribute(“ID”)]
公共int Id{get;set;}
[XmlElement(“Buildingtype”)]
公共字符串CategoryID{get;set;}
[XmlElement(“名称”)]
公共字符串名称{get;set;}
[XmlElement(“SMSInfoID”)]
公共虚拟SMSInfoID SMSInfoID{get;set;}
}
[XmlRoot(“SMSInfoID”)]
公共类SMSInfoID
{
[XmlElement(“ID”)]
公共列表ID{get;set;}
}
[XmlRoot(“ID”)]
公共类ID
{
[XmlAttribute(“默认值”)]
公共布尔值_默认值{get;set;}
[XmlText()]
公共int值{get;set;}
}
}

将属性
XmlText
添加到属性
Id
到类
Id

[XmlRoot("ID")]
public class ID
{
    [XmlText, Key] // <-- here
    public int Id { get; set; }
    [XmlAttribute("default")]
    public string Default { get; set; }
}
[XmlRoot(“ID”)]
公共类ID
{

[XmlText,Key]//这一切都不起作用!而且SMSInfoID是一个elment而不是arrayI无法控制xml,我们从服务接收它。不,没有任何更改,仍然是“SMSInfoID”:{“ID”:null},它起作用了,我可以看到elment保存在数据库中,但是当我尝试返回它时,它的embty会确保您正在使用该类的实例(facility)。我必须将此虚拟化以创建公共虚拟列表ID{get;set;}的关系,现在它可以工作了,谢谢