Tengo una List<string>
"sampleList" que contiene
Data1
Data2
Data3...
La estructura del archivo 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 usando XDocument?
c#
xml
linq-to-xml
Thorin Escudo de Roble
fuente
fuente
Respuestas:
LINQ to XML permite que esto sea mucho más simple, a través de tres características:
Así que aquí puedes 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 refleje la estructura del documento.
Si desea un elemento que contenga un nodo de texto, puede construirlo simplemente pasando el texto como otro argumento de constructor:
// Constructs <element>text within element</element> XElement element = new XElement("element", "text within element");
fuente
new XElement("description","this is the inner text of the description element.");
(similar a cómo agrega pares de atributo / valor)new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))
Con los ajustes de línea apropiados, esto se ve bastante bien nuevamente.El uso del método .Save significa que la salida tendrá una lista de materiales, con la que no todas las aplicaciones estarán satisfechas. Si no desea una lista de materiales, y si no está seguro, le sugiero que no lo haga, entonces pase el XDocument a través de un escritor:
using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false))) { doc.Save(writer); }
fuente