2009-06-16 15 views
14

puedo usar XDocument para construir el archivo después de lo cual funciona bien:Cómo construir un XDocument con un foreach y 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") 
      ) 
     ) 
); 

Sin embargo, que necesito para construir el archivo XML iteración a través de una colección así:

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 
} 

Hay Agregar, AddFirst, AddAfter Auto, AddBeforeSelf, pero podía conseguir ninguno de ellos para trabajar en este contexto.

es una iteración con LINQ como esto posible?

Respuesta:

Tomé sugerencia código de Jimmy con la etiqueta raíz, lo cambió un poco y era exactamente lo que estaba buscando:

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 registró una mejor respuesta a esto on this StackOverflow question.

Respuesta

25

Se necesita un elemento raíz.

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

muy resbaladizo, gracias! –

2

¿Qué pasa con la simple Add method?

+2

Supongo que el autor quiere una solución LINQ para este problema, excepto que no parece ser una. En realidad, este es un problema interesante - cómo convertir una 'IEnumerable' en una lista de parámetros adecuados =) –

3

Si no me equivoco, usted debería ser capaz de utilizar 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

Cuando utilizo este código me sale "esto crearía un documento XML falsamente estructurado", he intentado sustituir las variables con las "pruebas" y "prueba" pero el mismo error. –

3

Sé que es una publicación muy, pero me encontré con esto hoy tratando de resolver el mismo problema. Tiene que agregar el elemento a la raíz del documento:

xdoc.Root.Add(xelement); 
Cuestiones relacionadas