2009-06-05 88 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(),否則你的字符串不會完成創建。它將只是一個空字符串

相關問題