Asp.net mvc ASP.NET MVC:C#自定义将对象列表序列化为xml

Asp.net mvc ASP.NET MVC:C#自定义将对象列表序列化为xml,asp.net-mvc,xml-serialization,Asp.net Mvc,Xml Serialization,我有一个模型,我想将其序列化为具有特定属性的xml 型号: public class MyClassModel { public int Id { get; set; } public DateTime updated { get; set; } } 控制器操作中的代码: IList<MyClassModel> objects = getStuff(); return new XmlResult(jaPropEstates); //Asp.net mvc class

我有一个模型,我想将其序列化为具有特定属性的xml

型号:

public class MyClassModel
{
    public int Id { get; set; }
    public DateTime updated { get; set; }
}
控制器操作中的代码:

IList<MyClassModel> objects = getStuff();
return new XmlResult(jaPropEstates); //Asp.net mvc class that is inherited from ActionResult
IList objects=getStuff();
返回新的XmlResult(jaPropEstates)//从ActionResult继承的Asp.net mvc类
XmlResult类

public class XmlResult : ActionResult
{
    private object objectToSerialize;

    /// <summary>
    /// Initializes a new instance of the <see cref="XmlResult"/> class.
    /// </summary>
    /// <param name="objectToSerialize">The object to serialize to XML.</param>
    public XmlResult(object objectToSerialize)
    {
        this.objectToSerialize = objectToSerialize;
    }

    /// <summary>
    /// Gets the object to be serialized to XML.
    /// </summary>
    public object ObjectToSerialize
    {
        get { return this.objectToSerialize; }
    }

    /// <summary>
    /// Serialises the object that was passed into the constructor to XML and writes the corresponding XML to the result stream.
    /// </summary>
    /// <param name="context">The controller context for the current request.</param>
    public override void ExecuteResult(ControllerContext context)
    {
        if (this.objectToSerialize != null)
        {
            context.HttpContext.Response.Clear();
            var xs = new System.Xml.Serialization.XmlSerializer(this.objectToSerialize.GetType());
            context.HttpContext.Response.ContentType = "text/xml";
            xs.Serialize(context.HttpContext.Response.Output, this.objectToSerialize);
        }
    }
}
public类XmlResult:ActionResult
{
私有对象对象对象序列化;
/// 
///初始化类的新实例。
/// 
///要序列化为XML的对象。
公共XmlResult(对象对象对象序列化)
{
this.objectToSerialize=objectToSerialize;
}
/// 
///获取要序列化为XML的对象。
/// 
公共对象对象对象序列化
{
获取{返回this.objectToSerialize;}
}
/// 
///将传递到构造函数的对象序列化为XML,并将相应的XML写入结果流。
/// 
///当前请求的控制器上下文。
公共覆盖无效ExecuteSult(ControllerContext上下文)
{
if(this.objectToSerialize!=null)
{
context.HttpContext.Response.Clear();
var xs=new System.Xml.Serialization.XmlSerializer(this.objectToSerialize.GetType());
context.HttpContext.Response.ContentType=“text/xml”;
序列化(context.HttpContext.Response.Output,this.objectToSerialize);
}
}
}
输出:

<ArrayOfMyClassModel>
   <MyClassModel>
      <Id>0</Id>
      <updated>0001-01-01T00:00:00</updated>
   </MyClassModel>
   <MyClassModel>
      <Id>2</Id>
      <updated>0001-01-01T00:00:00</updated>
   </MyClassModel>

0
0001-01-01T00:00:00
2.
0001-01-01T00:00:00

我希望它是这样的:

<?xml version="1.0" encoding="utf-8" ?> <!-- I want this -->
<listings xmlns="listings-schema"> <!-- I want ArrayOfMyClassModel to be renamed to this -->
    <property> <!-- I want MyClassModel to be renamed to property -->
      <Id>2</Id>
      <updated>0001-01-01T00:00:00</updated>
    </property>
</listings>

2.
0001-01-01T00:00:00

请注意注释中的差异。如何为元素指定自定义名称?

我假设您有更大的数据集(按体积和复杂性)

我想到的第一种方法是在XmlDocument对象中获取输出,然后根据XSL转换对其进行转换

或者
System.Xml.Serialization.XmlSerializer
是另一种方法


请看一个示例

我假设您有更大的数据集(按容量和复杂性)

我想到的第一种方法是在XmlDocument对象中获取输出,然后根据XSL转换对其进行转换

或者
System.Xml.Serialization.XmlSerializer
是另一种方法


请参见示例签出。允许您完全控制XML序列化程序。

签出。使您能够完全控制XML序列化程序。

您的类称为“MyClassModel”。如果希望xml元素改为“property”,请将类重命名为“property”。但是,如果对类使用camel case而不是pascal case,则会违反常见的命名约定。

您的类称为“MyClassModel”。如果希望xml元素改为“property”,请将类重命名为“property”。然而如果对类使用camel-case而不是pascal-case,则会违反常见的命名约定。

第二个示例没有显示如何从原始属性名重命名节点。第二个示例没有显示如何从原始属性名重命名节点。因此无法在其上放置属性,因此在xml和不重新命名整个班级?我必须遵循提供给我的模式来公开数据。我认为有一个名为XmlType的属性,可以放在类上以在xml中重命名它。我习惯于将我的类和属性命名为与xml名称相同的名称,但使用属性也可以。因此,没有办法在其上放置属性,因此它在xml中重命名,而不是重命名整个类?我必须遵循提供给我的模式来公开数据。我认为有一个名为XmlType的属性,可以放在类上以在xml中重命名它。我习惯于将我的类和属性命名为与xml名称相同的名称,但是使用属性也可以。