c# - see - visual studio generate comment




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

Je crée un éditeur léger en C # et j'aimerais connaître la meilleure méthode pour convertir une chaîne en une chaîne XML bien formatée. J'espère qu'il y a une méthode publique dans la bibliothèque C # comme "public Bool FormatAsXml (texte de la chaîne, out string formatedXmlText)", mais cela ne pourrait pas être aussi simple, n'est-ce pas?

Très précisément, quelle devrait être la méthode "SomeMethod" qui produirait la sortie ci-dessous?

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>"
formattedXml = SomeMethod(unformattedXml);

Console.WriteLine(formattedXml);

Sortie:

<?xml version="1.0"?>
  <book id="123">
    <author>Lewis, C.S.</author>
    <title>The Four Loves</title>
  </book>

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

string theString = "<nodeName>blah</nodeName>";
XDocument doc = XDocument.Parse(theString);

Vous pouvez également créer un fragment avec:

string theString = "<nodeName>blah</nodeName>";
XElement element = XElement.Parse(theString);

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

string theString = "blah";
//creates <nodeName>blah</nodeName>
XElement element = new XElement(XName.Get("nodeName"), theString); 

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

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


Il semble que vous souhaitiez charger le code XML dans un objet XmlTextWriter et définir les propriétés Formatage et Indentation:

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

Si vous avez juste besoin d'échapper des caractères XML, les éléments suivants peuvent être utiles:

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

string unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
string formattedXml = XElement.Parse(unformattedXml).ToString();
Console.WriteLine(formattedXml);

Sortie:

<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>

La déclaration Xml n'est pas sortie par ToString (), mais par Save () ...

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

Sortie:

<?xml version="1.0" encoding="utf-8"?>
<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>

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

De toute façon, à 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'objet XmlTextWriter. Voir cette page MSDN pour plus de détails. Ça dit:

«Dans la version 2.0 de .NET Framework, la pratique recommandée consiste à créer des instances XmlWriter à l'aide de la méthode XmlWriter.Create et de la classe XmlWriterSettings, ce qui vous permet de tirer pleinement parti de toutes les nouvelles fonctionnalités introduites dans 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.WriteElementString("price", "19.95");
    writer.WriteEndElement();
    writer.Flush();
}

En supposant que vous vouliez simplement reformater un document XML pour mettre de nouveaux noeuds sur de nouvelles lignes et ajouter des indentations, alors, si vous utilisez .NET 3.5 ou supérieur, la meilleure solution est d'analyser ensuite la sortie avec XDocument, comme:

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
formattedXml = System.Xml.Linq.XDocument.Parse(unformattedXml).ToString();

Console.WriteLine(formattedXml);

Neat hu?

Cela devrait ensuite reformater les nœuds XML.

Pour faire cela avec les versions précédentes du framework, il faut beaucoup plus de travail, car il n'y a pas de fonctions intégrées pour recalculer les espaces.

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

string unformattedXml;
string formattedXml;

unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(unformattedXml);
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(sb, new System.Xml.XmlWriterSettings() { Indent = true });
doc.WriteTo(xw);
xw.Flush();
formattedXml = sb.ToString();
Console.WriteLine(formattedXml);

Dans Framework 4.0, c'est simple.

var unformattedXml = "<?xml version=\"1.0\"?><book><author>Lewis, C.S.</author><title>The Four Loves</title></book>";
var xdoc = System.Xml.Linq.XDocument.Parse(unformattedXml);
var formattedXml = (xdoc.Declaration != null ? xdoc.Declaration + "\r\n" : "") + xdoc.ToString();
Console.WriteLine(formattedXml);

Cela ajoute l'indentation requise et maintient la déclaration Xml .

<?xml version="1.0"?>
<book>
  <author>Lewis, C.S.</author>
  <title>The Four Loves</title>
</book>




string-formatting