40 votes

En C#, quelle est la meilleure méthode pour formater une chaîne de caractères au format XML?

Je suis entrain de créer un léger rédacteur en C# et j'aimerais savoir la meilleure méthode pour convertir une chaîne en un bien formaté chaîne XML. J'espère qu'il y a une méthode publique dans le C# de la bibliothèque comme "public bool FormatAsXml(string texte, hors de la chaîne de formattedXmlText)", mais il ne pouvait pas être si facile, pourrait-il?

Très précisément, quelle serait la méthode "SomeMethod" doivent être de nature à produire 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>

71voto

Wonko Points 1248
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 c'est 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>

15voto

Ash Points 31541

Malheureusement non, il n'est pas aussi facile que un FormatXMLForOutput méthode, c'est Microsoft parlions ici ;)

De toute façon, comme d' .NET 2.0, l'approche recommandée consiste à utiliser le XMlWriterSettingsClass pour configurer la mise en forme, par opposition à la définition des propriétés directement sur la XmlTextWriter objet. Voir cette page MSDN pour plus de détails. Il dit:

"Dans le .NET Framework version 2.0, il est recommandé de créer XmlWriter instances à l'aide de la XmlWriter.Créer de la méthode et de la XmlWriterSettings classe. Cela vous permet de profiter pleinement de toutes les nouvelles fonctionnalités introduites dans cette version. Pour plus d'informations, voir Création de XML Écrivains. "

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();
}

13voto

Jason Jackson Points 11563

En utilisant le nouveau Système.Xml.Linq espace de noms (le Système.Xml.Linq Assemblée), 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, c'est que XElement seront XML Encoder la condition de chaîne.

Je recommande fortement la nouvelle XLINQ classes. Ils sont légers, et plus facile à l'utilisateur que la majeure partie des XmlDocument types.

9voto

danielrbradley Points 623

En supposant que vous êtes simplement envie de le re-formater un document XML pour mettre de nouveaux nœuds sur les nouvelles lignes et ajouter l'indentation, alors, si vous êtes en utilisant .NET 3.5 ou ci-dessus, alors la meilleure solution est de les analyser puis de sortie 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?

Ceci devrait alors re-formater les nœuds XML.

Pour ce faire avec les versions précédentes du cadre nécessite beaucoup plus de travail sur le terrain, comme il n'est pas intégré dans les fonctions de re-calculer l'espace.

En fait, le faire à l'aide de pré-Linq classes 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);

5voto

defeated Points 814

Il semble que vous voulez charger le XML dans une XmlTextWriter objets et de définir la mise en forme et de l'Indentation propriétés:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X