Answers:
您需要创建一个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();
}
writer
不会被一次性处置吗?
我知道这很古老并且可以回答,但是这是另一种方法。特别是如果您不想在字符串开头使用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());
}
Encoding.UTF8.GetString(ms.ToArray())
是简化您的退货。
ms.ToArray()
我尝试此操作时不返回任何项目。必须x.Close()
在内部using语句之外添加或移动return语句。
伙计们不要忘记调用xmlWriter.Close()和xmlWriter.Dispose(),否则您的字符串将无法完成创建。这只是一个空字符串
xmlWriter.Close()
是解决方案。
好吧,我认为这里最简单,最快的解决方案是:
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());
}