2010-07-20 5 views
8

El siguiente código produce esta salida:¿Cómo puedo forzar a XDocument a producir "UTF-8" en la línea de declaración?

<?xml version="1.0" encoding="utf-16" standalone="yes"?> 
<customers> 
    <customer> 
    <firstName>Jim</firstName> 
    <lastName>Smith</lastName> 
    </customer> 
</customers> 

¿Cómo puedo conseguir que se produzca encoding="utf-8" en lugar de encoding="utf-16"?

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Xml.Linq; 

namespace test_xml2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Customer> customers = new List<Customer> { 
       new Customer {FirstName="Jim", LastName="Smith", Age=27}, 
       new Customer {FirstName="Hank", LastName="Moore", Age=28}, 
       new Customer {FirstName="Jay", LastName="Smythe", Age=44}, 
       new Customer {FirstName="Angie", LastName="Thompson", Age=25}, 
       new Customer {FirstName="Sarah", LastName="Conners", Age=66} 
      }; 

      Console.WriteLine(BuildXmlWithLINQ(customers)); 

      Console.ReadLine(); 

     } 
     private static string BuildXmlWithLINQ(List<Customer> customers) 
     { 
      XDocument xdoc = 
       new XDocument(
        new XDeclaration("1.0", "utf-8", "yes"), 
        new XElement("customers", 
         new XElement("customer", 
          new XElement("firstName", "Jim"), 
          new XElement("lastName", "Smith") 
         ) 
        ) 
       ); 

      var wr = new StringWriter(); 
      xdoc.Save(wr); 

      return wr.GetStringBuilder().ToString(); 
     } 
    } 

    public class Customer 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 

     public string Display() 
     { 
      return String.Format("{0}, {1} ({2})", LastName, FirstName, Age); 
     } 
    } 
} 

Respuesta

15

Permítame responder a mi propia pregunta, esto parece funcionar:

private static string BuildXmlWithLINQ() 
{ 
    XDocument xdoc = new XDocument 
    (
     new XDeclaration("1.0", "utf-8", "yes"), 
     new XElement("customers", 
      new XElement("customer", 
       new XElement("firstName", "Jim"), 
       new XElement("lastName", "Smith") 
      ) 
     ) 
    ); 
    return xdoc.Declaration.ToString() + Environment.NewLine + xdoc.ToString(); 
} 
+1

Parece un error en la API que el serializador ignora este valor en su 'XDeclaration'. –

+0

@KirkWoll No es cierto, ya que la codificación predeterminada para XML es UTF8, por lo que se puede omitir. Por lo tanto, surge la pregunta de por qué la necesidad de escribir explícitamente UTF-8 allí. Probablemente el problema fue que UTF-16 estaba allí, no es que no hubiera UTF-8. –

+0

solución más simple y funciona muy bien! – BJladu4

11

Esto no es un error en .NET. Esto se debe a que usa StringWriter como destino para su XDocument. Dado que StringWriter usa internamente UTF-16, el documento también debe usar UTF-16 como codificación. Si guarda el XDoc en una secuencia o un archivo, usará UTF-8 como se indica.

Para obtener más información, consulte MSDN information about StringWriter.Encoding:

Esta propiedad es necesaria para algunos escenarios donde una cabecera XML debe estar escrito que contiene la codificación utilizada por el StringWriter. Esto permite que el código XML consuma un StringWriter arbitrario y genere el encabezado XML correcto.

Cuestiones relacionadas