2009-06-23 8 views
2

Dans ma demande je construis un fichier XML avec ce code à l'aide StringBuilder:Comment puis-je changer ce code StringBuilder en XML en LINQ-to-XML?

StringBuilder sb = new StringBuilder(); 
sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine); 

sb.Append(String.Format("<{0}>{1}", _pluralCamelNotation, Environment.NewLine)); 
for (int index = 0; index < 3; index++) 
{ 
    sb.Append(String.Format("\t<{0}>{1}", _singularCamelNotation, Environment.NewLine)); 
    foreach (DataType dataType in _allDataTypes) 
    { 
     sb.Append(String.Format("\t\t<{0}>{2}</{0}>{1}", dataType.CamelCaseNotation, Environment.NewLine, dataType.GetDummyData())); 
    } 
    sb.Append(String.Format("\t</{0}>{1}", _singularCamelNotation, Environment.NewLine)); 
} 
sb.Append(String.Format("</{0}>{1}", _pluralCamelNotation, Environment.NewLine)); 

return sb.ToString(); 

Comment puis-je faire la même chose avec LINQ, quelque chose comme ceci:

PSEUDO-CODE: 

var xdoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    for (int index = 0; index < 3; index++) { 
     new XElement(_pluralCamelNotation, 
      _allDataTypes.Select(datatype => new XElement(_singularCamelNotation, 
       new XElement(datatype.CamelCaseNotation, datatype.GetDummyData()) 
      )) 
     ) 
    } 
); 
+0

exemple mis à jour pour montrer XmlWriterSettings –

Répondre

11

Même sans LINQ, vous ne devriez pas écrire xml par concaténation ... XmlWriter serait un bon ajustement:

XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.NewLineHandling = NewLineHandling.Entitize; 
    settings.Indent = true; 
    settings.IndentChars = "\t"; 

    StringBuilder sb = new StringBuilder(); 
    using (XmlWriter xw = XmlWriter.Create(sb, settings)) 
    { 
     xw.WriteStartDocument(); 
     xw.WriteStartElement(_pluralCamelNotation); 
     for (int i = 0; i < 3; i++) 
     { 
      xw.WriteStartElement(_singularCamelNotation); 
      foreach (DataType dataType in _allDataTypes) 
      { 
       xw.WriteElementString(dataType.ToString(), 
        dataType.GetDummyData()); 
      } 
      xw.WriteEndElement(); 
     } 
     xw.WriteEndElement(); 
     xw.WriteEndDocument(); 
     xw.Close(); 
    } 

Vous pouvez utiliser XmlWriterSettings pour contrôler des éléments tels que l'interligne.

Alternativement, avec LINQ to XML:

XDocument doc = new XDocument(
     new XDeclaration("1.0", null, null), 
     new XElement(_pluralCamelNotation, 
      Enumerable.Range(1,3).Select(
       i => new XElement(_singularCamelNotation, 
        _allDataTypes.Select(
         dataType => new XElement(
          dataType.ToString(), 
          dataType.GetDummyData()) 
        ) 
      )))); 

    string t = doc.ToString(); 
+0

les travaux de xmlwriter mais quand je l'ai mis dans ma TextBox.Text une ligne il le temps, comment puis-je faire insérer Environment.NewLine après chaque ligne? Il est dit que xw.Settings.NewLineChars est en lecture seule. –

+0

Je vais mettre à jour pour vous montrer ... –

+0

c'était très éducatif, merci –

0

Si vous voulez dire cette ligne:

_allDataTypes.Select(datatype => new XElement(_singularCamelNotation, 
       new XElement(datatype.CamelCaseNotation, datatype.GetDummyData()) 
      )) 

et _allDataTypes est une liste (attention est pas LinQ!) Vous pouvez le faire: Sachez que cela fonctionne vraiment uniquement avec List.

2

C'est un domaine dans lequel VB.Net gagne sur C# avec l'utilisation de littéraux XML. Regardez ce code tiré de http://blogs.msdn.com/jimoneil/archive/2009/06/15/x-is-for-xml-literal.aspx. N'est-ce pas beau?

Dim xml = <?xml version="1.0"?> 
     <menu> 
      <course name="appetizer"> 
       <%= From m In menu _ 
        Where m.Course = "appetizer" _ 
        Select <dish><%= m.Food %></dish> _ 
       %> 
      </course> 
      <course name="main"> 
       <%= From m In menu _ 
        Where m.Course = "main" _ 
        Select <dish><%= m.Food %></dish> _ 
       %> 
      </course> 
      <course name="dessert"> 
       <%= From m In menu _ 
        Where m.Course = "dessert" _ 
        Select <dish><%= m.Food %></dish> _ 
       %> 
      </course> 
     </menu> 
Questions connexes