Створення файлу XML за допомогою XDocument в C #


83

У мене є 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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.