2008-10-12 8 views
40

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 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?En C#, quelle est la meilleure méthode pour formater une chaîne en XML?

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> 

Répondre

69
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 Enregistrer() ...

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> 
+0

Merci, c'est juste ce que j'étais après :) – thatuxguy

+0

Il semble que la méthode Parse() n'analyse pas une chaîne sans la déclaration XML. –

0

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

XmlDocument xml = new XmlDocument(); 

xml.LoadXml(YourString); 
+1

N'avez-vous pas vu les deux ou trois autres réponses qui disent exactement la même chose? – cjk

5

On dirait que vous voulez charger le fichier XML dans un XmlTextWriter objets et définissez les propriétés de mise en forme et Indentation:

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

J'ai déjà utilisé cette approche par le passé (relativement facile), mais avec .NET 2.0 et versions ultérieures, Microsoft recommande maintenant d'utiliser la classe XmlTextWrtierSettings afin de tirer parti des nouvelles fonctionnalités ajoutées dans les versions 2.0 et 3.5. Voir le lien dans ma réponse. – Ash

15

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

Quoi qu'il en soit, à partir de .NET 2.0, l'approche recommandée est d'utiliser le XMlWriterSettingsClass pour configurer la mise en forme, par opposition à la définition des propriétés directement sur l'objet XmlTextWriter. See this MSDN page pour plus de détails. Il 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, ce qui vous permet de tirer pleinement parti de toutes les nouvelles fonctionnalités introduites dans . cette version Pour plus d'informations, consultez la section Création XML Writers "

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

Utilisation du nouvel espace de noms de System.Xml.Linq (System.Xml.Linq Assemblée) vous pouvez utiliser ce qui suit:

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 XElement XML encodera 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.

1

Si vous avez juste besoin d'échapper les caractères XML qui suit peut être utile:

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

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

Pourrait faire aussi bien que 1 ligne. – mpen

9

En supposant vouloir simplement Vous êtes en train de reformater un document XML pour mettre de nouveaux nœuds sur les nouvelles lignes et ajouter indenter, puis, si vous utilisez .NET 3.5 ou au-dessus, alors la meilleure solution est d'analyser ensuite 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?

Cela devrait ensuite reformater les nœuds XML. Pour cela, avec les versions précédentes de l'infrastructure, il est nécessaire de disposer de beaucoup plus de fonctionnalités car il n'y a pas de fonctions intégrées pour recalculer les espaces.

En fait, pour 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); 
0

System.Xml.Linq.XElement.ToString() formate automatiquement!

XElement formattedXML = new XElement.Parse(unformattedXmlString); 
Console.WriteLine(formattedXML.ToString()); 
1

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 dans l'empreinte requise et maintient la Déclaration Xml.

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