写入到一个string,而不是一个文件的XmlWriter

我有一个WCF服务需要返回一个XMLstring。 但似乎作家只想build立一个文件,而不是一个string。 我试过了:

string nextXMLstring = ""; using (XmlWriter writer = XmlWriter.Create(nextXMLstring)) 

这会产生一个错误,说明nextXMLstring没有文件path。 它需要像这样的东西:

 using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml")) 

我怎样才能build立我的XML,然后返回一个string?

谢谢!!

您需要创build一个StringWriter,并将其传递给XmlWriter。

XmlWriter.Create的string重载是一个文件名。

例如

 using (var sw = new StringWriter()) { using (var xw = XmlWriter.Create(sw)) { // Build Xml with xw. } return sw.ToString(); } 

理查德说, StringWriter是前进的道路。 有一个障碍,但是:默认情况下, StringWriter将宣传自己是在UTF-16。 通常 XML是UTF-8。 你可以通过子类化StringWriter来解决这个问题。

 public class Utf8StringWriter : StringWriter { public override Encoding Encoding { get { return Encoding.UTF8; } } } 

这将影响由XmlWriter写的声明。 当然,如果你以二进制的forms在其他地方写出string,确保你使用的编码与你为StringWriter修正的编码匹配。 (上面的代码总是采用UTF-8;在构造函数中接受一个编码的更通用的版本是微不足道的)。

然后你会使用:

 using (TextWriter writer = new Utf8StringWriter()) { using (XmlWriter xmlWriter = XmlWriter.Create(writer)) { ... } return writer.ToString(); } 

我知道这是古老的答案,但这是另一种方式来做到这一点。 特别是如果你不想在你的string的开始处使用UTF8 BOM,并且你想让文本缩进:

 using (var ms = new MemoryStream()) { using (var x = new XmlTextWriter(ms, new UTF8Encoding(false))  { Formatting = Formatting.Indented }) {  // ...  return Encoding.UTF8.GetString(ms.ToArray()); } } 

使用StringBuilder

 var sb = new StringBuilder(); using (XmlWriter xmlWriter = XmlWriter.Create(sb)) { ... } return sb.ToString(); 

人们不要忘记调用xmlWriter.Close()和xmlWriter.Dispose(),否则你的string将无法完成创build。 它将只是一个空的string