Как получить XML с заголовком (<? Xml version = "1.0"...)?

Рассмотрим следующий простой код, который создает документ XML и отображает его.

XmlDocument xml = new XmlDocument();
XmlElement root = xml.CreateElement("root");
xml.AppendChild(root);
XmlComment comment = xml.CreateComment("Comment");
root.AppendChild(comment);
textBox1.Text = xml.OuterXml;

он отображает, как и ожидалось:

<root><!--Comment--></root>

Однако он не отображает

<?xml version="1.0" encoding="UTF-8"?>   

Итак, как я могу получить это?

Ответ 1

Создайте XML-декларацию с помощью XmlDocument.CreateXmlDeclaration Method:

XmlNode docNode = xml.CreateXmlDeclaration("1.0", "UTF-8", null);
xml.AppendChild(docNode);

Примечание. Пожалуйста, взгляните на документацию для метода особенно для параметра encoding: для значений этого параметра существуют специальные требования.

Ответ 2

Вам нужно использовать XmlWriter (который по умолчанию записывает объявление XML). Следует отметить, что строки С# - это UTF-16, и ваше объявление XML говорит, что документ кодируется в кодировке UTF-8. Это несоответствие может вызвать проблемы. Вот пример, записывающий в файл, который дает ожидаемый результат:

XmlDocument xml = new XmlDocument();
XmlElement root = xml.CreateElement("root");
xml.AppendChild(root);
XmlComment comment = xml.CreateComment("Comment");
root.AppendChild(comment);

XmlWriterSettings settings = new XmlWriterSettings
{
  Encoding           = Encoding.UTF8,
  ConformanceLevel   = ConformanceLevel.Document,
  OmitXmlDeclaration = false,
  CloseOutput        = true,
  Indent             = true,
  IndentChars        = "  ",
  NewLineHandling    = NewLineHandling.Replace
};

using ( StreamWriter sw = File.CreateText("output.xml") )
using ( XmlWriter writer = XmlWriter.Create(sw,settings))
{
  xml.WriteContentTo(writer);
  writer.Close() ;
}

string document = File.ReadAllText( "output.xml") ;

Ответ 3

XmlDeclaration xmldecl;
xmldecl = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null);

XmlElement root = xmlDocument.DocumentElement;
xmlDocument.InsertBefore(xmldecl, root);