2013-02-12 10 views
13

Rozważ następujący prosty kod, który tworzy dokument XML i wyświetla go.Jak uzyskać XML z nagłówkiem (<? 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; 

wyświetla, zgodnie z oczekiwaniami:

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

, nie stanowią jednak wyświetlić

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

Więc jak mogę to równie dobrze?

Odpowiedz

20

Utwórz deklarację XML przy użyciu XmlDocument.CreateXmlDeclaration Method:

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

Uwaga: Należy zapoznać się z dokumentacją dla metody, szczególnie dla encoding parametru: istnieją specjalne wymagania dotyczące wartości tego parametru.

+0

Dzięki. Myślałem, że to było automatyczne. – ispiro

+0

+1. Należy pamiętać, że oczekiwanie "Utf-8" jest niezgodne z kodowaniem ciągu znaków (zobacz +1 odpowiedź Nicholas Carey). –

+0

@AlexeiLevenkov Dzięki. Ale jestem "OuterXml" i używa tego. Czy może czegoś brakuje i czy jest jeszcze problem? – ispiro

10

Musisz użyć XmlWriter (który domyślnie zapisuje deklarację XML). Należy zauważyć, że ciągi C# są UTF-16, a deklaracja XML mówi, że dokument jest kodowany w UTF-8. Ta rozbieżność może powodować problemy. Oto przykład, pisanie do pliku, który daje wynik można oczekiwać:

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

Dzięki. 'InsertBefore' wygląda na użyteczny. – ispiro

Powiązane problemy