Создание XML-файла с использованием XDocument на C #

84

У меня есть 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?

Торин Дубощит
источник
8
Пожалуйста, опубликуйте код, который вы написали до сих пор. Обычно люди не любят писать код за вас.
Mitch Wheat
5
Согласен - на самом деле это очень просто сделать одним утверждением, но простой ответ не поможет вам многому научиться.
Джон Скит

Ответы:

191

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");
Джон Скит
источник
16
Примечание. Если у вас есть элементы, которые должны иметь «внутренний текст», вы добавляете их так: new XElement("description","this is the inner text of the description element.");(аналогично тому, как вы добавляете пары атрибут / значение)
Myster
Очень красивый подход. Мгновение я ломал голову, как добавить атрибуты и linq-выражение элементов сразу. Так что, если кому-то интересно, я выбираю: new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))С соответствующими переносами строк это снова выглядит вполне нормально.
Себастьян Верк
0

Использование метода .Save означает, что вывод будет иметь спецификацию, которая не понравится всем приложениям. Если вам не нужна спецификация, и если вы не уверены, я предлагаю вам этого не делать, а затем передайте XDocument через писателя:

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
гость
источник