XDocument в строку: как опустить кодировку в объявлении?

#c# #asp.net #linq-to-xml

#c# #asp.net #linq-to-xml

Вопрос:

Я пишу оболочку для корпоративного XML-API braindead. У меня есть XDocument, который мне нужно превратить в строку. Из-за того, что их анализатор XML настолько привередлив, что он даже не может обрабатывать пробелы между узлами XML, объявление документа ДОЛЖНО БЫТЬ ТОЧНО:

 <?xml version="1.0"?>
  

Однако XDocument.Метод Save() всегда добавляет атрибут encoding в это объявление:

 <?xml version="1.0" encoding="utf-16"?>
  

За последний час, проведенный в Google и Stack в поисках наилучшего способа генерации строки XML, лучшее, что я могу сделать, это:

 string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty));
  

Я пробовал

 xdoc.Declaration = new XDeclaration("1.0", null, null);
  

и это действительно позволяет установить объявление в XDocument так, как я хочу; однако, когда я вызываю метод Save(), атрибут encoding волшебным образом возвращается туда, независимо от того, по какому маршруту я иду (используя TextWriter, добавляя XmlWriterSettings и т. Д.).

У кого-нибудь есть лучший способ сделать это, или мой код навсегда обречен на то, чтобы в комментариях над отвратительной строкой заменить абзац разглагольствования?

Ответ №1:

Ну, принимающая сторона должна быть исправлена, чтобы использовать синтаксический анализатор XML, а не что-то, что нарушает синтаксис XML, но с.NET если вы хотите создать строку с объявлением XML в том виде, в котором вы ее опубликовали, для меня работает следующий подход:

 public class MyStringWriter : StringWriter
{
    public override Encoding Encoding
    {
        get
        {
            return null;
        }
    }
}
  

и затем

     XDocument doc = new XDocument(
        new XDeclaration("1.0", null, null),
        new XElement("root", "test")
        );

    string xml;

    using (StringWriter msw = new MyStringWriter())
    {
        doc.Save(msw);
        xml = msw.ToString();
    }

    Console.WriteLine(xml);
  

выводит

 <?xml version="1.0"?>
<root>test</root>
  

Комментарии:

1. «принимающий конец должен быть исправлен» — вы не ошибаетесь. Но благословляю вас за то, что вы все равно ответили на вопрос.