1

次のWebサービスがあります。<?xml version="1.0" encoding="utf-8"?>出力には、ファイルの先頭にXML 宣言があります。モバイル アプリが正しく動作するためには、これを削除する必要があります。どうすればいいのですか?

[WebMethod]
    public XmlDocument GetTileData(string user)
    {
        var xml = new XmlDocument();
        xml.LoadXml(string.Format(@"<tile>
                                  <visual>
                                    <binding template='TileWideSmallImageAndText02'>
                                      <image id='1' src='http://server/images/{0}_wide.png'/>
                                      <text id='1'>Custom Field : {1}/text>
                                      <text id='2'>Custom Field : {2}</text>
                                      <text id='3'>Custom Field : {3}</text>
                                    </binding>
                                    <binding template='TileSquarePeekImageAndText01'>
                                      <image id='1' src='http://server/images/{0}_square.png'/>
                                      <text id='1'>Custom Field</text>
                                      <text id='2'>{1}</text>
                                    </binding>    
                                  </visual>
                                </tile>", value1, value2, value3, value4));

        return xml;
    }

編集 1: ドキュメントの代わりに Xml 要素を返そうとしましたが、どちらも機能していません。私はまだ宣言を見ています。

 [WebMethod]
        public XElement GetTileData(string user)
        {
            var xml = XDocument.Parse(string.Format(@"<tile>
                                      <visual>
                                        <binding template='TileWideSmallImageAndText02'>
                                          <image id='1' src='http://server/images/{0}_wide.png'/>
                                          <text id='1'>Custom Field : {1}/text>
                                          <text id='2'>Custom Field : {2}</text>
                                          <text id='3'>Custom Field : {3}</text>
                                        </binding>
                                        <binding template='TileSquarePeekImageAndText01'>
                                          <image id='1' src='http://server/images/{0}_square.png'/>
                                          <text id='1'>Custom Field</text>
                                          <text id='2'>{1}</text>
                                        </binding>    
                                      </visual>
                                    </tile>", value1, value2, value3, value4));

            return xml.Root;
        }

編集 2: HttpHandler を使用して、この問題を回避できました。以下の私の答えを見てください。

4

5 に答える 5

1

次のメソッドは、宣言なしでオブジェクトを XML に出力します。重要な部分は XmlWriterSettings クラスです。下記参照。

public static string SerializeToString(object obj)
        {
            var serializer = new XmlSerializer(obj.GetType());
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            var ms = new MemoryStream();
            //the following line omits the xml declaration
            var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = new UnicodeEncoding(false, false) };
            var writer = XmlWriter.Create(ms, settings);
            serializer.Serialize(writer, obj, ns);
            return Encoding.Unicode.GetString(ms.ToArray());
        }

このメソッドはクラス オブジェクトを操作するときに使用されますが、文字列を操作する場合も同じ原則が適用されます。重要な部分は XmlWriterSettings クラスであり、おそらく (投稿では言及されていませんが) XmlSerializerNamespaces クラスです。

このメソッドは、xml 宣言も名前空間も含まない文字列を返します。これは、使用する必要がある Web サービス フラグメントに対して完全に機能します。

- 編集 -

次の短いプログラムは、宣言とタグなしですべてを出力します。

var xml = new XmlDocument();
    var fragment = @"<tile>
                          <visual>
                            <binding template='TileWideSmallImageAndText02'>
                              <image id='1' src='http://server/images/{0}_wide.png'/>
                              <text id='1'>Custom Field : {1}/text>
                              <text id='2'>Custom Field : {2}</text>
                              <text id='3'>Custom Field : {3}</text>
                            </binding>
                            <binding template='TileSquarePeekImageAndText01'>
                              <image id='1' src='http://server/images/{0}_square.png'/>
                              <text id='1'>Custom Field</text>
                              <text id='2'>{1}</text>
                            </binding>    
                          </visual>
                        </tile>";

   var returnedXml = SerializeToString(fragment);
   returnedXml = returnedXml.Replace("<string>", "");
   returnedXml = returnedXml.Replace("</string>", "");
    Console.WriteLine(returnedXml);
}

public static string SerializeToString(string obj)
{
    var serializer = new XmlSerializer(obj.GetType());
    var ns = new XmlSerializerNamespaces();
    ns.Add("", "");
    var ms = new MemoryStream();
    //the following line omits the xml declaration
    var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Encoding = new UnicodeEncoding(false, false) };
    var writer = XmlWriter.Create(ms, settings);
    serializer.Serialize(writer, obj, ns);
    return Encoding.Unicode.GetString(ms.ToArray());
}
于 2012-10-16T22:53:40.340 に答える
0

これを試してください:http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.omitxmldeclaration.aspx

于 2012-10-16T23:02:31.740 に答える
0

XmlDocument オブジェクトを返す代わりに、文字列を返すreturn xml.InnerXml;

于 2012-10-16T22:01:21.470 に答える
0

Web サービスを取り除き、代わりに HttpHandler を使用することで、探している出力を得ることができました。ここにコードがあります -

     public class Handler1 : IHttpHandler
        {        
            public void ProcessRequest(HttpContext context)
            {
               var xml= @"<tile>
                      <visual>
                        <binding template='TileWideSmallImageAndText02'>
                          <image id='1' src='http://server/images/{0}_wide.png'/>
                          <text id='1'>Custom Field : {1}/text>
                          <text id='2'>Custom Field : {2}</text>
                          <text id='3'>Custom Field : {3}</text>
                        </binding>
                        <binding template='TileSquarePeekImageAndText01'>
                          <image id='1' src='http://server/images/{0}_square.png'/>
                          <text id='1'>Custom Field</text>
                          <text id='2'>{1}</text>
                        </binding>    
                      </visual>
                    </tile>";

               context.Response.ContentType = "text/xml";
               context.Response.Write(xml);
            }
        }
于 2012-10-17T00:13:18.137 に答える