3

我正在研究 asp.net mvc 4 web api。我有一堂课,

public class Quiz
{
public int QuizId{get; set;}
public string title{get; set;}
...
...
}

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

public List<Quiz> GetQuizs()
{
return repository.ListQuizs();
}

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

config.Formatters.XmlFormatter.UseXmlSerializer = true;

我得到了这样的回应,

<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>

但我想要这样的回应

<Quizs>
<Quiz>
<QuizId>4</QuizId>
<title>Master Minds</title>
</Quiz>
<Quiz>
<QuizId>5</QuizId>
<title>Master Minds</title>
</Quiz>
</Quiz>

我试过了,

public class quizs:List<Quiz>{}
public class Quiz
{
//properties here
}

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

4

3 回答 3

11

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

如果没有,您可以像这样实现您想要的:

  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"}
                       };
    }
}

最后使用 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>

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

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

于 2012-12-06T09:12:15.640 回答
3

您可以删除命名空间。只需创建一个 CustomXmlFormatter 即可从根元素中删除命名空间。

public class IgnoreNamespacesXmlMediaTypeFormatter : XmlMediaTypeFormatter
{
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
{
    try
    {
        var task = Task.Factory.StartNew(() =>
        {
            var xns = new XmlSerializerNamespaces();
            var serializer = new XmlSerializer(type);
            xns.Add(string.Empty, string.Empty);
            serializer.Serialize(writeStream, value, xns);
        });

        return task;
    }
    catch (Exception)
    {
        return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
    }
}
}
于 2012-12-18T07:15:57.257 回答
2

创建一个名为 QuizList 的类并实现 IXmlSerializable,您可以准确定义您希望 XML 的外观。

恕我直言,公开依赖于 .Net 类型序列化程序的内部实现的线路格式是一个非常糟糕的主意。序列化程序的整个想法是,当您想要反序列化对象时,您需要具有相同的序列化程序库和相同的类型来重构对象。如果您的客户不在 .net 平台上会怎样?

于 2012-12-06T13:46:12.187 回答