Как заставить XDocument вывести «UTF-8» в строке объявления? - PullRequest
9 голосов
/ 20 июля 2010

Следующий код производит этот вывод:

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

Как я могу заставить его производить encoding="utf-8" вместо 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);
        }
    }
}

Ответы [ 2 ]

16 голосов
/ 20 июля 2010

Позвольте мне ответить на мой собственный вопрос, похоже, это работает:

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();
}
13 голосов
/ 06 июня 2014

Это не ошибка в .NET.Это связано с тем, что вы используете StringWriter в качестве цели для вашего XDocument.Поскольку StringWriter внутренне использует UTF-16, документ также должен использовать UTF-16 в качестве кодировки.Если вы сохраните XDoc в поток или файл, он будет использовать UTF-8 в соответствии с инструкциями.

Для получения дополнительной информации см. Информация MSDN о StringWriter.Encoding:

Это свойство необходимо для некоторых сценариев XML, где должен быть написан заголовок, содержащий кодировку, используемую StringWriter.Это позволяет коду XML использовать произвольный StringWriter и генерировать правильный заголовок XML.

...