我有以下网络服务。输出在文件顶部有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来解决这个问题。请参阅下面的答案。
答案 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;
}
我的建议是保留第一行。