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

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

最後に、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 が null 値を処理できるようにするために、そこにある必要があるものを削除するのに苦労します。

コレクションに対する datacontract シリアライザーのサポートの詳細については、こちらを参照してください。

于 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 に答える