У меня есть List<string>
"sampleList", который содержит
Data1
Data2
Data3...
Файловая структура похожа на
<file>
<name filename="sample"/>
<date modified =" "/>
<info>
<data value="Data1"/>
<data value="Data2"/>
<data value="Data3"/>
</info>
</file>
В настоящее время я использую для этого XmlDocument.
Пример:
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");
Как я могу создать ту же структуру XML с помощью XDocument?
c#
xml
linq-to-xml
Торин Дубощит
источник
источник
Ответы:
LINQ to XML позволяет сделать это намного проще за счет трех функций:
Итак, здесь вы можете просто сделать:
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"); }
Я специально использовал этот макет кода, чтобы сам код отражал структуру документа.
Если вам нужен элемент, содержащий текстовый узел, вы можете создать его, просто передав текст в качестве другого аргумента конструктора:
// Constructs <element>text within element</element> XElement element = new XElement("element", "text within element");
источник
new XElement("description","this is the inner text of the description element.");
(аналогично тому, как вы добавляете пары атрибут / значение)new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))
С соответствующими переносами строк это снова выглядит вполне нормально.Использование метода .Save означает, что вывод будет иметь спецификацию, которая не понравится всем приложениям. Если вам не нужна спецификация, и если вы не уверены, я предлагаю вам этого не делать, а затем передайте XDocument через писателя:
using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false))) { doc.Save(writer); }
источник