2013-02-12 2 views
13

Рассмотрим следующий простой код, который создает XML-документ и отображает его.Как получить XML с заголовком (<? Xml version = "1.0" ...)?

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"?> 

Так как я могу получить, что хорошо?

ответ

20

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

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

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

+0

Спасибо. Я думал, что это было автоматически. – ispiro

+0

+1. Обратите внимание, что ожидание «Utf-8» несовместимо с кодировкой строки (см. +1 ответ Николаса Кэри). –

+0

@AlexeiLevenkov Спасибо. Но я 'OuterXml' это и использую это. Или я что-то упускаю, и тогда есть проблема? – ispiro

10

Вам необходимо использовать XmlWriter (который записывает объявление XML по умолчанию). Следует отметить, что строки C# - это 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") ; 
4
XmlDeclaration xmldecl; 
xmldecl = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null); 

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

Спасибо. 'InsertBefore' выглядит полезным. – ispiro

Смежные вопросы