首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于.Net MVC模型的自定义XML feed

基于.Net MVC模型的自定义XML feed
EN

Stack Overflow用户
提问于 2016-01-20 00:15:23
回答 2查看 184关注 0票数 1

我们正在使用XMLMVC5重做一个遗留应用程序。该应用程序的一部分会生成.Net提要,供其他应用程序使用。

我们构建了一个名为Call的模型

代码语言:javascript
复制
[XmlRoot("record")]
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("starttime")]
    public DateTime Entry { get; set; }
    [XmlElement("endtime")]
    public DateTime Exit { get; set; }
    [XmlElement("cnumber")][NotMapped]
    public string Number
    {
        get { return Prefix + Code + CustomerNumber; } 
    }
}

使用控制器:

代码语言:javascript
复制
public class CallsController : ApiController
{
    private DbContext db = new DbContext();

    // GET: api/Calls
    public IQueryable<Call> GetCalls()
    {
        return db.Calls;
    }
}

它会生成如下XML提要:

代码语言:javascript
复制
  <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>

但是,我需要定制XML提要以提供以下输出:

代码语言:javascript
复制
<?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>

没有遵循XmlRoot数据注释,CNumber也没有包含在我的XML提要中。调用应该在根为<data>的XML提要中显示为<record>。如何解决这些问题?我是不是走错路了?我应该改用视图模型吗?

EN

回答 2

Stack Overflow用户

发布于 2016-01-20 02:04:07

1.-数据类:

代码语言:javascript
复制
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;
    }
}

2.-使用您的示例数据:

代码语言:javascript
复制
    //  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);

3.-序列化助手:

代码语言:javascript
复制
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
            };
        }
    }
}

4.-输出:

代码语言:javascript
复制
<?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>

干杯

票数 2
EN

Stack Overflow用户

发布于 2016-01-20 00:27:06

要创建与您想要的内容相匹配的XML,可以创建一个名为Data的对象,该对象可以提供一个包含记录的列表。

代码语言:javascript
复制
public class Data{
   public List<Record> Records{get;set;}
}

目前您正在返回一个调用数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34881694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档