XmlWriter写入字符串而不是文件

时间:2009-06-05 12:33:36

标签: c# xml

我有一个需要返回XML字符串的WCF服务。但似乎作者只想建立一个文件而不是字符串。我试过了:

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

这会产生一个错误,说明nextXMLstring没有文件路径。它需要类似的东西:

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

如何构建我的XML然后将其作为字符串返回?

谢谢!

6 个答案:

答案 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());
}