2009-06-16 5 views
14

Je peux utiliser XDocument pour construire le fichier suivant qui fonctionne très bien:Comment construire un XDocument avec foreach et LINQ?

XDocument xdoc = new XDocument 
(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement(_pluralCamelNotation, 
     new XElement(_singularCamelNotation, 
      new XElement("id", "1"), 
      new XElement("whenCreated", "2008-12-31") 
     ), 
     new XElement(_singularCamelNotation, 
      new XElement("id", "2"), 
      new XElement("whenCreated", "2008-12-31") 
      ) 
     ) 
); 

Cependant, je dois construire le fichier XML par itérer une collection comme ceci:

XDocument xdoc = new XDocument 
(
    new XDeclaration("1.0", "utf-8", null)); 

foreach (DataType dataType in _dataTypes) 
{ 
    XElement xelement = new XElement(_pluralCamelNotation, 
     new XElement(_singularCamelNotation, 
     new XElement("id", "1"), 
     new XElement("whenCreated", "2008-12-31") 
    )); 
    xdoc.AddInterally(xelement); //PSEUDO-CODE 
} 

Il y a Ajouter, AddFirst, AddAfter Self, AddBeforeSelf, mais je n'ai pu obtenir aucun d'eux pour fonctionner dans ce contexte.

Une itération avec LINQ est-elle possible?

Réponse:

Je pris la suggestion de code de Jimmy avec la balise racine, a changé un peu et il était exactement ce que je cherchais:

var xdoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement(_pluralCamelNotation, 
     _dataTypes.Select(datatype => new XElement(_singularCamelNotation, 
      new XElement("id", "1"), 
      new XElement("whenCreated", "2008-12-31") 
     )) 
    ) 
); 

Marc Gravell a affiché une meilleure réponse à ce on this StackOverflow question.

Répondre

25

Vous avez besoin d'un élément racine.

var xdoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement("Root", 
     _dataTypes.Select(datatype => new XElement(datatype._pluralCamelNotation, 
      new XElement(datatype._singlarCamelNotation), 
      new XElement("id", "1"), 
      new XElement("whenCreated", "2008-12-31") 
     )) 
    ) 
); 
+0

très lisse, merci! –

2

Quel est le problème avec le simple Add method?

+2

Je suppose que l'auteur veut une solution LINQ à ce problème, sauf qu'il ne semble pas en être un. En fait, c'est un problème intéressant - comment transformer un 'IEnumerable' en une liste de paramètres appropriée =) –

3

Si je ne me trompe pas, vous devriez pouvoir utiliser XDocument.Add():

XDocument xdoc = new XDocument 
(
    new XDeclaration("1.0", "utf-8", null)); 

foreach (DataType dataType in _dataTypes) 
{ 
    XElement xelement = new XElement(_pluralCamelNotation, 
     new XElement(_singularCamelNotation, 
     new XElement("id", "1"), 
     new XElement("whenCreated", "2008-12-31") 
    )); 
    xdoc.Add(xelement); 
} 
+2

Quand j'utilise ce code je reçois" ceci créerait un document XML faussement structuré ", j'ai essayé de remplacer les variables par" tests " et "test" mais la même erreur. –

3

Je sais que c'est très très ancien, mais je suis tombé sur ce problème aujourd'hui en essayant de résoudre le même problème. Vous devez ajouter l'élément à la racine du document:

xdoc.Root.Add(xelement); 
Questions connexes