2010-06-01 12 views
71

tengo una "sampleList" List<string> que contienecreación del archivo XML usando XDocument en C#

Data1 
Data2 
Data3... 

La estructura de archivos es como

<file> 
    <name filename="sample"/> 
    <date modified =" "/> 
    <info> 
    <data value="Data1"/> 
    <data value="Data2"/> 
    <data value="Data3"/> 
    </info> 
</file> 

actualmente estoy usando XmlDocument para hacer esto.

Ejemplo:

List<string> lst; 
XmlDocument XD = new XmlDocument(); 
XmlElement root = XD.CreateElement("file"); 
XmlElement nm = XD.CreateElement("name"); 
nm.SetAttribute("filename", "Sample"); 
root.AppendChild(nm); 
XmlElement date = XD.CreateElement("date"); 
date.SetAttribute("modified", DateTime.Now.ToString()); 
root.AppendChild(date); 
XmlElement info = XD.CreateElement("info"); 
for (int i = 0; i < lst.Count; i++) 
{ 
    XmlElement da = XD.CreateElement("data"); 
    da.SetAttribute("value",lst[i]); 
    info.AppendChild(da); 
} 
root.AppendChild(info); 
XD.AppendChild(root); 
XD.Save("Sample.xml"); 

¿Cómo puedo crear la misma estructura XML utilizando XDocument?

+8

Por favor enviar el código que ha escrito hasta el momento. En general, a la gente no le gusta escribir tu código por ti. –

+5

Estoy de acuerdo: esto es muy simple de hacer en una sola declaración, pero solo darte la respuesta no te ayudará a aprender mucho. –

Respuesta

161

LINQ to XML permite que esto sea mucho más simple, a través de tres características:

  • puede construir un objeto sin conocer el documento es parte de
  • Puede construir un objeto y proporcionar a los niños como argumentos
  • Si un argumento es iterable, se repiten a lo largo

Así que aquí sólo se puede hacer:

void Main() 
{ 
    List<string> list = new List<string> 
    { 
     "Data1", "Data2", "Data3" 
    }; 

    XDocument doc = 
     new XDocument(
     new XElement("file", 
      new XElement("name", new XAttribute("filename", "sample")), 
      new XElement("date", new XAttribute("modified", DateTime.Now)), 
      new XElement("info", 
      list.Select(x => new XElement("data", new XAttribute("value", x))) 
     ) 
     ) 
    ); 

    doc.Save("Sample.xml"); 
} 

He usado este diseño de código deliberadamente para hacer que el código en sí refleje la estructura del documento.

Si desea un elemento que contiene un nodo de texto, se puede construir que con sólo pasar en el texto como otro argumento del constructor:

// Constructs <element>text within element</element> 
XElement element = new XElement("element", "text within element"); 
+7

@ Jon Skeet: Gracias .... :-) –

+14

Nota: Si tiene elementos que necesitan tener "texto interno", agréguelos de la siguiente manera: 'nuevo XElement (" description "," este es el texto interno de el elemento de descripción. ");' (similar a cómo se agregan pares de atributo/valor) – Myster

Cuestiones relacionadas