繁体   English   中英

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

[英]Remove Xml declaration from web service response

我有以下Web服务。 输出在文件顶部具有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来解决此问题。 请参阅下面的答案。

以下方法将在不声明的情况下将对象输出到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());
}

代替返回XmlDocument对象,返回字符串return xml.InnerXml;

通过摆脱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);
            }
        }

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

为什么要这样做?

如果要执行此操作,请将其转换为字符串...在WebMethod中,将其从XmlDocument更改为字符串...使用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; 
} 

但是我的建议是保留第一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM