2009-12-23 7 views
0

Comment est-il possible de forcer un espacement supplémentaire entre certains nœuds en utilisant Linq vers Xml? Je cherche à sortir ce qui suit:Espacement des sorties avec Linq vers Xml

<root> 

    <group> 
     <leaf /> 
    </group> 

    <group> 
     <leaf /> 
    </group> 

</root> 

En ajoutant XText vide, il détruit seulement la mise en forme.

var root = 
    new XElement("root", 
     new XText(""), 
     new XElement("group", 
      new XElement("leaf")), 
     new XText(""), 
     new XElement("group", 
      new XElement("leaf")), 
     new XText("")); 

Console.WriteLine(root.ToString()); 

entraînant

<root><group><child /></group><group><child /></group></root> 

Répondre

1

C'est une solution, mais pas beau ... d'une manière

changement XText à xComment et faire quelque chose comme ça ...


    var root = 
     new XElement("root", 
      new XComment(""), 
      new XElement("group", 
       new XElement("leaf")), 
      new XComment(""), 
      new XElement("group", 
       new XElement("leaf")), 
      new XComment("")); 

    Console.WriteLine(XElementToText(root)); 


    private string XElementToText(XElement element) 
    { 
     var sb = new StringBuilder(); 
     using (var writer = XmlWriter.Create(sb, 
      new XmlWriterSettings {Indent = true})) 
     { 
      element.WriteTo(writer); 
     } 
     return sb.ToString().Replace("<!---->", string.Empty); 
    } 

Modifier: Fogott pour échapper à moins de ...

+0

Haha nick hack! Je n'ai pas pensé à celui-ci! Pas la meilleure solution, mais fait définitivement le travail –

0

passer un XmlTextWriter (avec Formatting ensemble à Formatting.Indented) à root.WriteTo().

Par exemple:

using(var writer = new XmlTextWriter(Console.Out)); 
{ 
    writer.Formatting = Formatting.Indented; 
    root.WriteTo(writer); 
} 
+0

'XmlTextWriter' est obsolète. –

+0

Il n'est certainement pas – Randolpho

+0

La documentation officielle (http://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.aspx) n'est pas d'accord: "Dans la version .NET Framework version 2.0, la pratique recommandée est pour 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 Création d'écrivains XML. –

1
using (var writer = XmlWriter.Create(
    Console.Out, 
    new XmlWriterSettings { Indent = true }) 
{ 
    root.WriteTo(writer); 
} 
+0

Ne fonctionne pas pour moi. L'espacement supplémentaire n'apparaît pas –

+0

Il semble que je (et non moi seul) ai mal compris votre question - vous ne voulez pas seulement l'indentation, vous voulez aussi ces lignes vides entre les éléments. Si vous le souhaitez, vous devrez insérer vos propres nœuds 'XText' - pas les nœuds vides, mais avec la bonne quantité de' \ n' et d'espaces ou de tabulations pour obtenir l'indentation exacte dont vous avez besoin. –

+0

Oui, désolé si ma question est trompeuse. Le problème avec XText est que si vous le mélangez avec XElements, il casse la mise en forme. Avoir à ajouter explicitement tous les onglets est un peu moche. (ie nouveau XText ("\ n \ t \ t")) –