我有一个需要返回XML字符串的WCF服务。但似乎作者只想建立一个文件而不是字符串。我试过了:
string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))
这会产生一个错误,说明nextXMLstring没有文件路径。它需要类似的东西:
using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))
如何构建我的XML然后将其作为字符串返回?
谢谢!
答案 0 :(得分:199)
您需要创建一个StringWriter,并将其传递给XmlWriter。
XmlWriter.Create的字符串重载用于文件名。
E.g。
using (var sw = new StringWriter()) {
using (var xw = XmlWriter.Create(sw)) {
// Build Xml with xw.
}
return sw.ToString();
}
答案 1 :(得分:106)
正如理查德所说,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();
}
答案 2 :(得分:28)
我知道这已经老了并且已经回答了,但这是另一种方法。特别是如果您不希望字符串开头的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());
}
答案 3 :(得分:11)
使用StringBuilder
:
var sb = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(sb))
{
...
}
return sb.ToString();
答案 4 :(得分:1)
伙计们不要忘记调用xmlWriter.Close()和xmlWriter.Dispose(),否则你的字符串将无法完成创建。它只是一个空字符串
答案 5 :(得分:-1)
好吧,我认为这里最简单,最快的解决方案就是:
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());
}