C# 如何使用XElement.ToString()包含声明

C# 如何使用XElement.ToString()包含声明,c#,xml,serialization,wcf-rest,C#,Xml,Serialization,Wcf Rest,我正在尝试为我的web服务编写一个XML响应,但是我不知道如何使声明出现在响应中 我的代码是这样的: StringBuilder sBuilder = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sBuilder)) { writer.WriteStartDocument(); writer.WriteStartElement("ReportResponse"); Response.Wri

我正在尝试为我的web服务编写一个XML响应,但是我不知道如何使声明出现在响应中

我的代码是这样的:

StringBuilder sBuilder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sBuilder))
{
    writer.WriteStartDocument();
    writer.WriteStartElement("ReportResponse");
    Response.WriteXml(writer);
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

var response = XElement.Parse(sBuilder.ToString());
return response;
响应只是用于存储响应数据的POCO

我知道
Save
方法包含声明,而
ToString()
方法不包含声明。我需要用
ToString()
写回我的声明


我真的只想从REST服务返回自定义XML,而不需要将字符串转换100次以返回有效的XML。这是可能的还是我只是在转动轮子?

如果您想包含xml声明,可以这样做:

XDocument xdoc = XDocument.Parse(xmlString);
StringBuilder builder = new StringBuilder();
using (TextWriter writer = new StringWriter(builder))
{
    xdoc.Save(writer);
}
Console.WriteLine(builder);
更新: 我注意到,StringWriter破坏了编码。因此,还有一个选择是这样做:

string docWithDeclaration = xdoc.Declaration + xdoc.ToString();

为什么不使用序列化为XML的类呢?我可以使用这种方法,但由于不同的原因,我遇到了相同的问题。如果需要XML声明,为什么要返回
XElement
而不是
XDocument
?另外,为什么要关心声明?如果您只是返回了一个响应对象,并让WCF序列化程序将数据协定对象转换为XML,那么您就不必担心响应XML是否有效。如果您确实需要显示声明,但默认情况下不需要,那么您应该在服务级别配置该声明,而不是在每个方法上配置该声明。我们不使用默认编码,xml标头指定了这一点。