[英]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.