2009-06-05 35 views
98

XMLの文字列を返す必要があるWCFサービスがあります。しかし、作家は文字列ではなくファイルを構築したいと思うようです。私は試しました:ファイルの代わりに文字列に書き込むXmlWriter

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

これは、次のエラーが発生することを意味しますnextXMLstringはファイルパスを持っていません。それは次のようなものが欲しい:

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

XMLをビルドして文字列として戻すにはどうすればよいですか?

ありがとうございます!

答えて

178

StringWriterを作成し、それをXmlWriterに渡す必要があります。

XmlWriter.Createの文字列のオーバーロードは、ファイル名に対するものです。

など。

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


    } 
    return sw.ToString(); 
} 
+2

@ウィル:あなたの変更をロールバックします。 XmlTextWriter.Close()はストリームにフラッシュします。そのため、文字列を抽出する前にストリームを生成します。 (このケースではほとんど違いはありませんが、WriterクラスとStreamクラスのフラッシュセマンティクスが常に明確に文書化されているわけではないので、これを一貫して行うほうがいいです) – Richard

+1

これを使用している人のための単なるコメントです。 using()を省略し、代わりにXmlWriterを通常宣言した場合は、sw.ToString()を呼び出す前にxw.Flushを呼び出す必要があります。そうしないと、すべてのコンテンツを取得できない可能性があります。 (明らかに使用ブラケットを使用することをお勧めします...) – Ravendarksky

+0

次のコードは、コード分析、beacuse Dispose()メソッドは、StringWriterオブジェクトで2回呼び出されるCA2202の警告を与えることを覚えてください –

100

リチャードは言ったように、StringWriterは道です。しかし、1つの問題があります。デフォルトでは、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これはよく見落とされ、 。 –

+0

これは「公開オーバーライドエンコーディングエンコーディング」になります。 – Einar

+0

@Einar:ありがとう、修正されました。 –

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()); 
    } 
} 
+3

'Encoding.UTF8.GetString(ms.ToArray())'は返品時に簡素化されています。 – SliverNinja

+0

@Siver Ninja Nice!追加されました。 – brianary

+1

'私はこれを試したときに' ms.ToArray() 'は何も返しません。 'x.Close()'を追加するか、内部usingステートメントのすぐ外側にreturnステートメントを移動しなければなりません。 –

8

使用StringBuilder

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

GuysはxmlWriter.Closeを呼び出すことを忘れないでください()とxmlWriter.Dispose()のいずれかでなければ、文字列は作成を終了しません。それはちょうど空の文字列になります

+0

心配しないでください。文を使用すると、オブジェクトの処分が処理されます。 –

+0

これは2009年の質問です。したがって、回答を提供することの価値は、今後同様の問題が発生する可能性があるユーザーのためになります。したがって、このような古い質問に対する回答は、問題を明確に特定し、解決策を説明/提供できる場合にのみ提供する必要があります。彼らは会話の中でOPに参加しようとするのは、通常、彼らが動いている可能性が高いため、無駄です。 – MikeC

関連する問題