C# xml C中的数组反序列化#
我有这个XmlC# 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
<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;}的关系,现在它可以工作了,谢谢