从Web服务响应中删除Xml声明

时间:2012-10-16 21:59:01

标签: c# xml web-services

我有以下网络服务。输出在文件顶部有XML声明<?xml version="1.0" encoding="utf-8"?>。我需要摆脱它,让我的移动应用程序正常工作。我该怎么做?

[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来解决这个问题。请参阅下面的答案。

5 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

不是返回XmlDocument对象,而是返回字符串return xml.InnerXml;

答案 2 :(得分:0)

答案 3 :(得分: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);
            }
        }

答案 4 :(得分:-1)

有效的XML文档将始终将其作为文档的第一行。没有这条线就无法创建XML文档,即使这样做,也不是有效的XML。

你为什么要这样做?

如果你想这样做,将它转换为字符串...在你的WebMethod中将它从XmlDocument更改为string ...使用C#删除第一行并将其作为字符串返回。

[WebMethod] 
public string GetTileData(string user) 
{ 
    string xml = 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; 
} 

我的建议是保留第一行。