C# 基于.NETMVC模型的自定义XML提要

C# 基于.NETMVC模型的自定义XML提要,c#,xml,asp.net-mvc-5,xml-serialization,asp.net-web-api2,C#,Xml,Asp.net Mvc 5,Xml Serialization,Asp.net Web Api2,我们正在使用.NETMVC5重做一个遗留应用程序。应用程序的一部分生成其他应用程序使用的XML提要 我们建立了一个叫Call的模型 [XmlRoot(“记录”)] 公开课电话 { [XmlIgnore] 公共int ID{get;set;} [XmlIgnore] 公共字符串CustomerInitials{get;set;} [XmlIgnore] 公共字符串前缀{get;set;} [XmlIgnore] 公共字符串代码{get;set;} [XmlIgnore] 公共字符串Customer

我们正在使用.NETMVC5重做一个遗留应用程序。应用程序的一部分生成其他应用程序使用的XML提要

我们建立了一个叫Call的模型

[XmlRoot(“记录”)]
公开课电话
{
[XmlIgnore]
公共int ID{get;set;}
[XmlIgnore]
公共字符串CustomerInitials{get;set;}
[XmlIgnore]
公共字符串前缀{get;set;}
[XmlIgnore]
公共字符串代码{get;set;}
[XmlIgnore]
公共字符串CustomerNumber{get;set;}
[XmlElement(“starttime”)]
公共日期时间项{get;set;}
[XmlElement(“结束时间”)]
公共日期时间出口{get;set;}
[XmlElement(“cnumber”)][NotMapped]
公共字符串号
{
获取{return Prefix+Code+CustomerNumber;}
}
}
使用控制器:

public类调用控制器:ApiController
{
private DbContext db=new DbContext();
//获取:api/调用
公共IQueryable GetCalls()
{
返回db.Calls;
}
}
它生成以下内容的XML提要:

  <ArrayOfCall xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Call>
      <starttime>2016-01-15T14:45:24.447</starttime>
      <endtime>2016-01-15T15:45:24.447</endtime>
    </Call>
    <Call>
      <starttime>2016-01-15T15:46:35.637</starttime>
      <endtime>2016-01-15T16:46:35.637</endtime>
    </Call>
  </ArrayOfCall>

2016-01-15T14:45:24.447
2016-01-15T15:45:24.447
2016-01-15T15:46:35.637
2016-01-15T16:46:35.637
但是,我需要自定义XML提要以提供以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<DATA>
    <RECORD>
        <CNUMBER>593042401</CNUMBER>
        <STARTTIME>2016-01-15T14:45:24.447</STARTTIME>
        <ENDTIME>2016-01-15T15:45:24.447</ENDTIME>
    </RECORD>
    <RECORD>
        <CNUMBER>593042401</CNUMBER>
        <STARTTIME>2016-01-15T15:46:35.637</STARTTIME>
        <ENDTIME>2016-01-15T16:46:35.637</ENDTIME>
    </RECORD>
</DATA>

593042401
2016-01-15T14:45:24.447
2016-01-15T15:45:24.447
593042401
2016-01-15T15:46:35.637
2016-01-15T16:46:35.637

XmlRoot数据注释不在后面,CNumber不包含在我的XML提要中。调用应在XML提要中显示为
,根为
。如何解决这些问题?我走错方向了吗?我应该使用视图模型吗?

要创建与所需内容相匹配的XML,可以创建一个名为Data的对象,该对象可以提供一个保存记录的列表

public class Data{
   public List<Record> Records{get;set;}
}
公共类数据{
公共列表记录{get;set;}
}
当前您正在返回一个调用数组。

1.-数据类:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;

namespace StackOverflow
{
    public class Call
    {
        [XmlIgnore]
        public int ID { get; set; }
        [XmlIgnore]
        public string CustomerInitials { get; set; }
        [XmlIgnore]
        public string Prefix { get; set; }
        [XmlIgnore]
        public string Code { get; set; }
        [XmlIgnore]
        public string CustomerNumber { get; set; }

        [XmlElement("CNUMBER")]
        public string Number
        {
            get { return Prefix + Code + CustomerNumber; }
        }
        [XmlElement("STARTTIME")]
        public DateTime Entry { get; set; }
        [XmlElement("ENDTIME")]
        public DateTime Exit { get; set; }
    }

    [XmlRoot(ElementName = "DATA")]
    public class Data
    {
        [XmlElement("RECORD")]
        public List<Call> Calls;
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Xml.Serialization;
命名空间堆栈溢出
{
公开课电话
{
[XmlIgnore]
公共int ID{get;set;}
[XmlIgnore]
公共字符串CustomerInitials{get;set;}
[XmlIgnore]
公共字符串前缀{get;set;}
[XmlIgnore]
公共字符串代码{get;set;}
[XmlIgnore]
公共字符串CustomerNumber{get;set;}
[XmlElement(“CNUMBER”)]
公共字符串号
{
获取{return Prefix+Code+CustomerNumber;}
}
[XmlElement(“STARTTIME”)]
公共日期时间项{get;set;}
[XmlElement(“结束时间”)]
公共日期时间出口{get;set;}
}
[XmlRoot(ElementName=“DATA”)]
公共类数据
{
[XmlElement(“记录”)]
公开名单电话;
}
}
2.-使用您的示例数据:

    //  1.- Data
    var data = new Data();
    var calls = new List<Call>
    {
        new Call
        {
            Entry = new DateTime(2016, 1, 15, 14, 45, 24, 447),
            Exit = new DateTime(2016, 1, 15, 15, 45, 24, 447)
        },
        new Call
        {
            Entry = new DateTime(2016, 1, 15, 15, 46, 35, 637),
            Exit = new DateTime(2016, 1, 15, 16, 46, 35, 637)
        }
    };
    data.Calls = new List<Call>(calls);

    //  2.- Serialize the objet to byte[]
    var dataByteArray = new XmlSerializerHelper<Data>().ObjectToByteArray(data, Encoding.GetEncoding("UTF-8"), true);

    //  3.- Save the byte[] to disk
    File.WriteAllBytes("D:/xml.xml", dataByteArray);
/1.-数据
var data=新数据();
var calls=新列表
{
新电话
{
条目=新的日期时间(2016,1,15,14,45,24447),
退出=新日期时间(2016,1,15,15,45,24447)
},
新电话
{
条目=新的日期时间(2016,1,15,15,46,35637),
退出=新日期时间(2016,1,15,16,46,35637)
}
};
data.Calls=新列表(调用);
//2.-将对象序列化为字节[]
var-dataByteArray=new-XmlSerializerHelper().ObjectToByteArray(数据,Encoding.GetEncoding(“UTF-8”),true);
//3.-将字节[]保存到磁盘
File.writealBytes(“D:/xml.xml”,dataByteArray);
3.-序列化程序帮助程序:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace StackOverflow
{
    public class XmlSerializerHelper<T> where T : class
    {
        private readonly XmlSerializer _serializer;

        public XmlSerializerHelper()
        {
            _serializer = new XmlSerializer(typeof(T));
        }

        public byte[] ObjectToByteArray(T obj, Encoding encoding = null, bool ignoreNAmespaces = false)
        {
            var settings = GetSettings(encoding);
            using (var memoryStream = new MemoryStream())
            {
                using (var writer = XmlWriter.Create(memoryStream, settings))
                {
                    if (ignoreNAmespaces)
                    {
                        var serializerNamespaces = new XmlSerializerNamespaces();
                        serializerNamespaces.Add("", "");
                        _serializer.Serialize(writer, obj, serializerNamespaces);
                    }
                    else
                    {
                        _serializer.Serialize(writer, obj);
                    }
                }
                return memoryStream.ToArray();
            }
        }

        private XmlWriterSettings GetSettings(Encoding encoding)
        {
            return new XmlWriterSettings
            {
                Encoding = encoding ?? Encoding.GetEncoding("ISO-8859-1"),
                Indent = true,
                IndentChars = "\t",
                NewLineChars = Environment.NewLine,
                ConformanceLevel = ConformanceLevel.Document
            };
        }
    }
}
使用系统;
使用System.IO;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间堆栈溢出
{
公共类XmlSerializerHelper,其中T:class
{
私有只读XmlSerializer\u序列化程序;
公共XMLRHELPER()
{
_serializer=新的XmlSerializer(typeof(T));
}
公共字节[]ObjectToByteArray(T obj,编码=null,bool ignoreNAmespaces=false)
{
var设置=GetSettings(编码);
使用(var memoryStream=new memoryStream())
{
使用(var writer=XmlWriter.Create(memoryStream,设置))
{
if(忽略名称空间)
{
var serializerNamespaces=新的XmlSerializerNamespaces();
serializerNamespaces.Add(“,”);
_serializer.Serialize(writer、obj、serializerNamespaces);
}
其他的
{
_serializer.Serialize(writer,obj);
}
}
返回memoryStream.ToArray();
}
}
私有XmlWriterSettings GetSettings(编码)
{
返回新的XmlWriterSettings
{
Encoding=Encoding??Encoding.GetEncoding(“ISO-8859-1”),
缩进=真,
IndentChars=“\t”,
NewLineChars=Environment.NewLine,
ConformanceLevel=ConformanceLevel.Document
};
}
}
}
4.产出:

<?xml version="1.0" encoding="utf-8"?>
<DATA>
    <RECORD>
        <STARTTIME>2016-01-15T14:45:24.447</STARTTIME>
        <ENDTIME>2016-01-15T15:45:24.447</ENDTIME>
    </RECORD>
    <RECORD>
        <STARTTIME>2016-01-15T15:46:35.637</STARTTIME>
        <ENDTIME>2016-01-15T16:46:35.637</ENDTIME>
    </RECORD>
</DATA>

2016-01-15T14:45:24.447
2016-01-15T15:45:24.447
2016-01-15T15:46:35.637
2016-01-15T16:46:35.637

喝彩声

通话结束时号码是否可以为空?这可以解释为什么它没有显示在原始XML中。我已经检查了我的本地数据库,数字字段使用的每个字段都有值。可能是因为它是一个复合字段(可能不是正确的术语)?我之所以返回调用,是因为我们正在重做应用程序,而实际的模型是