#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. «принимающий конец должен быть исправлен» — вы не ошибаетесь. Но благословляю вас за то, что вы все равно ответили на вопрос.