web-dev-qa-db-fra.com

Comment obtenir XML avec en-tête (<? Xml version = "1.0" ...)?

Considérez le code simple suivant qui crée un document XML et l'affiche.

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

il affiche, comme prévu:

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

Il n’affiche cependant pas

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

Alors, comment puis-je obtenir cela aussi?

18
ispiro

Créez une déclaration XML en utilisant méthode XmlDocument.CreateXmlDeclaration :

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

Remarque: veuillez consulter la documentation de la méthode, en particulier pour le paramètre encoding: il existe des exigences spéciales pour les valeurs de ce paramètre .

28
Sergey Brunov

Vous devez utiliser un XmlWriter (qui écrit la déclaration XML par défaut). Vous devez noter que les chaînes C # sont UTF-16 et votre déclaration XML indique que le document est codé UTF-8. Cette divergence peut entraîner des problèmes. Voici un exemple d'écriture dans un fichier qui donne le résultat attendu:

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") ;
13
Nicholas Carey
XmlDeclaration xmldecl;
xmldecl = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null);

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