如何在asp.net web api中将xml序列化为所需的格式

Kar*_*idi 3 asp.net-mvc xml-serialization asp.net-web-api

我正在开发asp.net mvc 4 web api.我有一个类,

public class Quiz
{
public int QuizId{get; set;}
public string title{get; set;}
...
...
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试检索测验列表,所以我写的像,

public List<Quiz> GetQuizs()
{
return repository.ListQuizs();
}
Run Code Online (Sandbox Code Playgroud)

我需要xml响应,所以我在webapi.config文件中进行了配置,如,

config.Formatters.XmlFormatter.UseXmlSerializer = true;
Run Code Online (Sandbox Code Playgroud)

我收到了回复,

<ArrayOfQuiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Quiz>
<QuizId>4</QuizId>
<title>Master Minds</title>
</Quiz>
<Quiz>
<QuizId>5</QuizId>
<title>Master Minds</title>
</Quiz>
</ArrayOfQuiz>
Run Code Online (Sandbox Code Playgroud)

但我想要的回应就像

<Quizs>
<Quiz>
<QuizId>4</QuizId>
<title>Master Minds</title>
</Quiz>
<Quiz>
<QuizId>5</QuizId>
<title>Master Minds</title>
</Quiz>
</Quiz>
Run Code Online (Sandbox Code Playgroud)

我试过像,

public class quizs:List<Quiz>{}
public class Quiz
{
//properties here
}
Run Code Online (Sandbox Code Playgroud)

但是我无法将测验列表加载到测验类中.请指导我.

Mar*_*nes 11

您是否有任何理由在DataContract序列化器上使用XmlSerializer?

如果没有,你可以实现你想要的:

  1. 删除config.Formatters.XmlFormatter.UseXmlSerializer = true; 从你的配置
  2. 添加对System.Runtime.Serialisation的引用
  3. 声明你的类和控制器

[DataContract(Namespace = "")]
public class Quiz
{
    [DataMember]
    public int QuizId { get; set; }
    [DataMember(Name = "title")]
    public string Title { get; set; }
}

[CollectionDataContract(Name = "Quizs", Namespace = "")]
public class QuizCollection : List<Quiz>
{
}

public class QuizsController : ApiController
{
    public QuizCollection Get()
    {
        return new QuizCollection
                       {
                           new Quiz {QuizId = 4, Title = "Master Minds"},
                           new Quiz {QuizId = 5, Title = "Another Title"}
                       };
    }
}
Run Code Online (Sandbox Code Playgroud)

最后使用html标题"accept:application/xml"调用您的服务

你的结果应该是这样的:

<Quizs xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Quiz>
        <QuizId>4</QuizId>
        <title>Master Minds</title>
        </Quiz>
    <Quiz>
        <QuizId>5</QuizId>
        <title>Another Title</title>
    </Quiz>
</Quizs>
Run Code Online (Sandbox Code Playgroud)

关于你的命名空间NB.它们如何在属性中设置为namespace =""以删除它们.您将要删除xmlns:i="http://www.w3.org/2001/XMLSchema-instance"它需要在那里允许XML处理空值.

有关数据收集序列化器对集合的支持的更多信息,请参见此处