要写入字符串而不是文件的 XmlWriter

我有一个需要返回 XML 字符串的 WCF 服务。但是编写器似乎只想构建一个文件,而不是一个字符串。我试过:

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

这会产生一个错误,说明 nextXMLstring 没有文件路径:

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

如何构建 XML 并将其作为字符串返回?

谢谢!

142676 次浏览

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

XmlWriter.Create 的字符串重载用于文件名。

例如。

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编写的声明。当然,如果然后以二进制形式将字符串写出其他地方,请确保使用与您为 StringWriter修复的任何编码相匹配的编码。(上面的代码总是假设 UTF-8; 制作一个接受构造函数中编码的更通用的版本是很简单的。)

然后你会用:

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

我知道这很老套,也有答案,但还有另一种方法。特别是如果您不希望在字符串的开头显示 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 () ,否则字符串将无法完成创建。它将只是一个空字符串

我认为最简单最快的解决方案就是:

StringBuilder sb = new StringBuilder();


using (var writer = XmlWriter.Create(sb, settings))
{
... // Whatever code you have/need :)


sb = sb.Replace("encoding=\"utf-16\"", "encoding=\"utf-8\""); //Or whatever uft you want/use.
//Before you finally save it:
File.WriteAllText("path\\dataName.xml", sb.ToString());
}