1

我有以下网络服务。<?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

我能够通过摆脱 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 回答
0

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

于 2012-10-16T22:01:21.470 回答
-1

有效的 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; 
} 

但是,我的建议是将第一行保留在那里。

于 2012-10-16T22:34:21.260 回答