Je crée un éditeur léger en C # et je voudrais 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 chaîne, chaîne de formatageXmlText)", mais cela ne pourrait pas être aussi simple, n'est-ce pas?
Plus précisément, quelle serait 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);
Production:
<?xml version="1.0"?>
<book id="123">
<author>Lewis, C.S.</author>
<title>The Four Loves</title>
</book>
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);
Production:
<book>
<author>Lewis, C.S.</author>
<title>The Four Loves</title>
</book>
La déclaration Xml n'est pas sortie par ToString (), mais c'est par Save () ...
XElement.Parse(unformattedXml).Save(@"C:\doc.xml");
Console.WriteLine(File.ReadAllText(@"C:\doc.xml"));
Production:
<?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 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, au lieu de définir des propriétés directement sur l'objet XmlTextWriter. Voir cette page MSDN pour plus de détails. Ça dit:
"Dans la version .NET Framework version 2.0, la pratique recommandée consiste à 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 introduites dans cette version. Pour plus d'informations, voir Création de rédacteurs 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 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 encodera 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.
En supposant que vous vouliez simplement reformater un document XML pour mettre de nouveaux nœuds sur de nouvelles lignes et ajouter un retrait, alors, si vous utilisez .NET 3.5 ou supérieur, la meilleure solution consiste à analyser puis à produire avec XDocument, quelque chose 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 ce faire 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);
Il semble que vous souhaitiez charger le XML dans un XmlTextWriter objets 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 string FormatXmlString(string xmlString)
{
System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
return element.ToString();
}
Si vous avez juste besoin d'échapper les caractères XML, les éléments suivants peuvent être utiles:
string myText = "This & that > <> <";
myText = System.Security.SecurityElement.Escape(myText);
Dans Framework 4.0, il 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>
La chaîne XML est-elle valide? Voulez-vous dire comment pouvez-vous convertir une chaîne XML en un document XML? Si oui, procédez comme suit:
XmlDocument xml = new XmlDocument();
xml.LoadXml( YourString );
System.Xml.Linq.XElement.ToString () Formate automatiquement!
XElement formattedXML = new XElement.Parse(unformattedXmlString);
Console.WriteLine(formattedXML.ToString());