XmlWriter写入字符串而不是文件

Bla*_*aze 111 c# xml

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

string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))
Run Code Online (Sandbox Code Playgroud)

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

using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))
Run Code Online (Sandbox Code Playgroud)

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

谢谢!!

Ric*_*ard 209

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

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

例如

using (var sw = new StringWriter()) {
  using (var xw = XmlWriter.Create(sw)) {
    // Build Xml with xw.


  }
  return sw.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • @Will:回滚你的改变.XmlTextWriter.Close()将刷新到流,因此希望在提取字符串之前发生这种情况.(在这种情况下差别不大,但更喜欢这样做,因为*Writer和Stream类的flush语义并不总是清楚地记录下来.) (2认同)

Jon*_*eet 110

正如理查德所说,StringWriter是前进的方向.然而,有一个障碍:默认情况下,StringWriter会将自己宣传为UTF-16.通常 XML是UTF-8.您可以通过继承StringWriter来解决这个问题.

public class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding
    {
         get { return Encoding.UTF8; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将影响所写的声明XmlWriter.当然,如果你以二进制形式将字符串写在别处,请确保使用的编码与您为其修复的编码相匹配StringWriter.(上面的代码总是假定为UTF-8;在构造函数中创建一个接受编码的更通用的版本是微不足道的.)

然后你用:

using (TextWriter writer = new Utf8StringWriter())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(writer))
    {
        ...
    }
    return writer.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • +1这经常被忽视,而且很重要. (5认同)
  • @rasx:可能是 - 但这无关紧要. (2认同)

bri*_*ary 29

我知道这是旧的并且回答了,但这是另一种方法.特别是如果您不希望字符串开头的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());
}
Run Code Online (Sandbox Code Playgroud)

  • `Encoding.UTF8.GetString(ms.ToArray())`简化了你的回归. (3认同)

Ria*_*Ria 12

用途StringBuilder:

var sb = new StringBuilder();
    using (XmlWriter xmlWriter = XmlWriter.Create(sb))
    {
        ...
    }
return sb.ToString();
Run Code Online (Sandbox Code Playgroud)


小智 5

大家不要忘记调用 xmlWriter.Close() 和 xmlWriter.Dispose() ,否则您的字符串将无法完成创建。它只是一个空字符串