2010-07-20 13 views
8

Poniższy kod produkuje ten wyjściowe:Jak zmusić XDocument do wyprowadzenia "UTF-8" w linii deklaracji?

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

Jak mogę zmusić go do produkcji encoding="utf-8" zamiast 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); 
     } 
    } 
} 

Odpowiedz

15

Pozwól mi odpowiedzieć na moje własne pytanie, to wydaje się działać:

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

Wydaje mi się, że błąd w API dla mnie oznacza, że ​​serializator ignoruje tę wartość w twoim 'XDeclaration'. –

+0

@KirkWoll Naprawdę, ponieważ domyślnym kodowaniem dla XML jest UTF8, więc można go pominąć. Dlatego też nasuwa się pytanie, dlaczego istnieje potrzeba wyraźnego napisania tam UTF-8. Prawdopodobnie problem polegał na obecności UTF-16, a nie na tym, że nie było UTF-8. –

+0

Najprostsze rozwiązanie i działa świetnie! – BJladu4

11

To nie jest błąd w .NET. Jest to spowodowane używaniem StringWriter jako celu dla twojego XDocument. Ponieważ StringWriter wewnętrznie używa UTF-16, dokument musi również używać kodowania UTF-16. Jeśli zapiszesz XDoc do strumienia lub pliku, użyje UTF-8 zgodnie z instrukcją.

Aby uzyskać więcej informacji, zobacz MSDN information about StringWriter.Encoding:

Ta nieruchomość jest niezbędna dla niektórych scenariuszach XML gdzie nagłówek musi być pisemne zawierające kodowanie używane przez StringWriter. Dzięki temu kod XML może wykorzystywać arbitralny StringWriter i generować poprawny nagłówek XML.

Powiązane problemy