En C #, quelle est la meilleure méthode pour formater une chaîne en XML?

Je crée un éditeur léger en C # et souhaite connaître la meilleure méthode pour convertir une chaîne en une chaîne XML joliment formatée. J’espère qu’il y a une méthode publique dans la bibliothèque C # comme “public bool FormatAsXml (texte de chaîne, out ssortingng formattedXmlText)”, mais cela ne pourrait pas être si facile, n’est-ce pas?

Très précisément, quelle serait la méthode “SomeMethod” qui produirait la sortie ci-dessous?

ssortingng unformattedXml; ssortingng formattedXml; unformattedXml = "Lewis, CSThe Four Loves" formattedXml = SomeMethod(unformattedXml); Console.WriteLine(formattedXml); 

Sortie:

   Lewis, CS The Four Loves  

 ssortingng unformattedXml = "Lewis, CSThe Four Loves"; ssortingng formattedXml = XElement.Parse(unformattedXml).ToSsortingng(); Console.WriteLine(formattedXml); 

Sortie:

  Lewis, CS The Four Loves  

La déclaration XML n’est pas générée par ToSsortingng (), mais par Save () …

  XElement.Parse(unformattedXml).Save(@"C:\doc.xml"); Console.WriteLine(File.ReadAllText(@"C:\doc.xml")); 

Sortie:

   Lewis, CS The Four Loves  

Malheureusement non, ce n’est pas aussi simple qu’une méthode FormatXMLForOutput, c’est ce dont Microsoft parlait ici;)

Quoi qu’il en soit, à partir de .NET 2.0, l’approche recommandée consiste à utiliser XMlWriterSettingsClass pour configurer la mise en forme, par opposition à la définition de propriétés directement sur l’object XmlTextWriter. Voir cette page MSDN pour plus de détails. Ça dit:

“Dans la version .NET Framework version 2.0, il est recommandé de créer des instances XmlWriter à l’aide de la méthode XmlWriter.Create et de la classe XmlWriterSettings. Cela vous permet de tirer pleinement parti de toutes les nouvelles fonctionnalités de cette version. voir Création d’écrivains XML. ”

Voici un exemple de l’approche recommandée:

 XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = (" "); using (XmlWriter writer = XmlWriter.Create("books.xml", settings)) { // Write XML data. writer.WriteStartElement("book"); writer.WriteElementSsortingng("price", "19.95"); writer.WriteEndElement(); writer.Flush(); } 

En utilisant le nouvel espace de noms System.Xml.Linq (System.Xml.Linq Assembly), vous pouvez utiliser les éléments suivants:

 ssortingng theSsortingng = "blah"; XDocument doc = XDocument.Parse(theSsortingng); 

Vous pouvez également créer un fragment avec:

 ssortingng theSsortingng = "blah"; XElement element = XElement.Parse(theSsortingng); 

Si la chaîne n’est pas encore XML, vous pouvez faire quelque chose comme ceci:

 ssortingng theSsortingng = "blah"; //creates blah XElement element = new XElement(XName.Get("nodeName"), theSsortingng); 

Quelque chose à noter dans ce dernier exemple est que XElement sera XML Encoder la chaîne fournie.

Je recommande vivement les nouvelles classes XLINQ. Ils sont plus légers et plus faciles à utiliser que la plupart des types existants liés à XmlDocument.

En supposant que vous vouliez simplement reformater un document XML pour mettre de nouveaux nœuds sur de nouvelles lignes et append une indentation, alors, si vous utilisez .NET 3.5 ou supérieur, la meilleure solution est d’parsingr puis de sortir avec XDocument.

 ssortingng unformattedXml; ssortingng formattedXml; unformattedXml = "Lewis, CSThe Four Loves"; formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToSsortingng(); Console.WriteLine(formattedXml); 

Neat hu?

Cela devrait ensuite reformater les nœuds XML.

Faire cela avec les versions précédentes de l’infrastructure nécessite beaucoup plus de travail, car il n’ya pas de fonctions intégrées pour recalculer les espaces.

En fait, le faire en utilisant des classes pré-Linq serait:

 ssortingng unformattedXml; ssortingng formattedXml; unformattedXml = "Lewis, CSThe Four Loves"; System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.LoadXml(unformattedXml); System.Text.SsortingngBuilder sb = new System.Text.SsortingngBuilder(); System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb, new System.Xml.XmlWriterSettings() { Indent = true }); doc.WriteTo(xw); xw.Flush(); formattedXml = sb.ToSsortingng(); Console.WriteLine(formattedXml); 

Il semble que vous souhaitiez charger le XML dans des objects XmlTextWriter et définir les propriétés de formatage et d’indentation:

 writer.Formatting = Formatting.Indented; writer.Indentation = 1; writer.IndentChar = '\t'; 

L’approche de Jason est la plus simple. Voici la méthode:

 private static ssortingng FormatXmlSsortingng(ssortingng xmlSsortingng) { System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlSsortingng); return element.ToSsortingng(); } 

Si vous devez simplement échapper des caractères XML, les éléments suivants peuvent être utiles:

 ssortingng myText = "This & that > <> <"; myText = System.Security.SecurityElement.Escape(myText); 

Dans Framework 4.0, c’est simple.

 var unformattedXml = "Lewis, CSThe Four Loves"; var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml); var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "\r\n" : "") + xdoc.ToSsortingng(); Console.WriteLine(formattedXml); 

Cela ajoute l’indentation requirejse et maintient la déclaration XML .

   Lewis, CS The Four Loves  

La chaîne est-elle valide XML? Voulez-vous dire comment convertir une chaîne XML en un document XML? Si oui, faites ceci:

 XmlDocument xml = new XmlDocument(); xml.LoadXml( YourSsortingng ); 

System.Xml.Linq.XElement.ToSsortingng () Formats automatiquement!

 XElement formattedXML = new XElement.Parse(unformattedXmlSsortingng); Console.WriteLine(formattedXML.ToSsortingng());