2013-02-07 15 views
6

devo xml che mando da API in un altro Resurse. L'ho creato da XDocument:Come modificare la codifica nell'oggetto TextWriter?

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

Quando l'ho inserito nella richiesta, è stato inviato senza dichiarazione. Quindi faccio il seguente:

StringBuilder builder = new StringBuilder(); 
TextWriter writer = new StringWriter(builder); 

using (writer) 
{ 
    xDoc.Save(writer); 
} 

Ma ora TextWriter cambia codifica in xml in utf-16. Devo cambiare di nuovo su utf-8.

risposta

13

Questo sembra strano, ma sembra che si deve creare una sottoclasse StringWriter se si vuole l'output a un string con codifica UTF-8 nel xml.

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

Prova

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

o

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

o 'Encoding.GetEncoding (1256)' se avete bisogno di una pagina di codice specifico (1256 è l'arabo) – BlueChippy

+0

'StreamWriter' sembra la soluzione più ovvia, sì; dopotutto, è l'implementazione personalizzabile e codificante di 'TextWriter', il tipo previsto da' XDocument.Save'. Anche solo per tornare a String (ma ottenere la dichiarazione XML giusta), lo uso solo su un 'MemoryStream'. – Nyerguds

Problemi correlati