2009-06-05 42 views
98

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

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

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

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

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

谢谢!

回答

178

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

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

E.g.

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


    } 
    return sw.ToString(); 
} 
+2

@Will:回滚您的更改。 XmlTextWriter.Close()将刷新到流,所以要在提取字符串之前进行。 (在这种情况下差别不大,但更喜欢一致地执行此操作,因为* Writer和Stream类的清除语义并不总是清楚地记录在案。) – Richard 2009-06-05 13:57:33

+1

只是对使用此操作的人的评论。如果你碰巧忽略了using(),而是通常声明你的XmlWriter,那么在你调用sw.ToString()之前一定要调用xw.Flush,否则你可能无法获得所有内容! (显然最好使用括号......) – Ravendarksky 2014-07-16 10:34:45

+0

请记住,以下代码在代码分析期间给出了CA2202警告,因为Dispose()方法将在StringWriter对象上被调用两次 – 2016-08-25 11:58:53

100

正如Richard所说,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(); 
} 
+5

+1这经常被忽视并且很重要。 – 2009-09-02 20:27:54

23

我知道这是老回答,但这是另一种方式来做到这一点。特别是如果你不想在你的字符串的开始,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()); 
    } 
} 
8

使用StringBuilder

var sb = new StringBuilder(); 
    using (XmlWriter xmlWriter = XmlWriter.Create(sb)) 
    { 
     ... 
    } 
return sb.ToString(); 
0

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

相关问题