写入到一个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