0

Web API アプリ用のカスタム XmlFormatter を開発しています。「IEnumerable」要素を異なる方法で処理したい。コードは次のとおりです。

class CustomXmlFormatter : XmlMediaTypeFormatter
{
    public override Task WriteToStreamAsync(Type type, object value, System.IO.Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext, System.Threading.CancellationToken cancellationToken)
    {
        XmlSerializer serializer;

            return Task.Factory.StartNew(() =>
            {
                if ((typeof(IEnumerable<object>)).IsAssignableFrom(type))
                {

                    XmlWriter writer = XmlWriter.Create(writeStream);                       

                    writer.WriteStartElement("array");

                 /*   foreach (object o in (IEnumerable<object>)value)
                    {
                        serializer = new XmlSerializer(o.GetType());

                        serializer.Serialize(writeStream, o);
                    }*/

                    writer.WriteEndElement();

                }
                else
                {
                    serializer = new XmlSerializer(type);

                    serializer.Serialize(writeStream, value, xsn);
                }
            }); 

リストを受け取ると、「配列」のタグを書き込み、リストのすべての要素をシリアル化するという考え方です。質問を簡単にするために foreach ループにコメントしました。

問題は、コードが実行されると、空の XML (「配列」タグなし) が書き込まれることです。どうすればそのようなものを実装できますか?

4

1 に答える 1

0

エラーが発生しますか? おそらくあなたの配列項目には、xmlタグで有効でない値があります。そして、これが起こってxmlデータが空になりました。配列内のアイテムの検証を確認する必要があります。すべての文字が xml タグ名の検証ではありません。この例を使用する方が良いと思います:

 sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
                    //Write the header
                    sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
                    //Write our root node
                    sr.WriteLine("<" + node.Text + ">");
                    sr.WriteLine("array");
                    sr.WriteLine("</" + node.Text + ">");
于 2015-03-18T12:50:39.070 に答える