2013-02-07 7 views
6

私は別のリースでAPIで送信するXMLを持っています。私はXDocumentでそれを作成します:TextWriterオブジェクトのエンコーディングを変更するには?

XDocument xDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("Entity",new XAttribute("Type", "attribute1"), 
     new XElement("Fields",... 

私はそれを要求に入れて宣言せずに送信しました。だから私は次のようにします:

しかし、TextWriterはxmlのエンコーディングをutf-16に変更しました。私はutf-8で再び変更する必要があります。

答えて

13

を試してみてくださいこれは奇妙に思えるが、あなたは、あなたがstringに出力したい場合は、XMLでUTF-8エンコーディングでStringWriterをサブクラス化する必要があるように見えます。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     XDocument xDoc = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("Entity",new XAttribute("Type", "attribute1"))); 

     StringBuilder builder = new StringBuilder(); 
     using (TextWriter writer = new EncodingStringWriter(builder, Encoding.UTF8)) 
     { 
      xDoc.Save(writer); 
     } 

     Console.WriteLine(builder.ToString()); 
    } 
} 

public class EncodingStringWriter : StringWriter 
{ 
    private readonly Encoding _encoding; 

    public EncodingStringWriter(StringBuilder builder, Encoding encoding) : base(builder) 
    { 
     _encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return _encoding; }     
    } 
} 
4

TextWriter ws = new StreamWriter(path, true, Encoding.UTF8); 

または

TextWriter ws = new StreamWriter(stream, Encoding.UTF8); 
+1

または 'Encoding.GetEncoding(1256)あなたは、特定のコード・ページ(1256年はアラビア語である) – BlueChippy

+0

が必要な場合は、' 'StreamWriter'がはい、明白な解決策のように思えます。結局のところ、 'XDocument.Save'によって期待される' TextWriter'の特定のコード化可能な実装です。 Stringに戻っただけでも(XML宣言を正しく取得する)、私はこれを 'MemoryStream'で使用します。 – Nyerguds