Как я могу создать один список из родительского и дочернего узла из XML с помощью Linq - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно создать один список из xml-файла, где есть некоторое значение из узла Parent и Some из Child с использованием Linq. Затем мне нужно связать этот список в виде одного списка в пользовательском интерфейсе

<item>
  <name>AAA</name>
  <id>94926DD03DB67FE30B456E50A0C34DF6</id>
  <files>
    <update>1533861455395</update>
    <file>
      <name>1532997455395.pdf</name>
      <update>1532997455395</update>
    </file>
    <file>
      <name>1533861455395.pdf</name>
      <update>1533861455395</update>
    </file>
  </files>
</item>
<item>
  <name>BBB</name>
  <id>A16779822115170AECAD570D0139E8F3</id>
  <files>
    <file>
      <name>1530405455395.pdf</name>
      <update>1530405455395</update>
    </file>
  </files>
</item>

Код, который я написал, где FileName отображается правильно, но в обновлении значение не возвращается

public void xml()
    {
        XDocument loadedData = XDocument.Load(xmlUrl);
        var lstBooks = loadedData.Descendants("item").Select(x =>
                        new
                        {
                            FileName = x.Element("name").Value,
                            Update = x.Elements("files").Select(y => y.Element("update").Value),

                        }).ToList();
    }

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вы должны создать таблицу данных и заполнить все столбцы, как показано ниже:

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Item Name", typeof(string));
            dt.Columns.Add("Item ID", typeof(string));
            dt.Columns.Add("Files Update", typeof(string));
            dt.Columns.Add("File Name", typeof(string));
            dt.Columns.Add("File Update", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);

            foreach (XElement item in doc.Descendants("item"))
            {
                string name = (string)item.Element("name");
                string itemID = (string)item.Element("id");

                foreach (XElement files in item.Elements("files"))
                {
                    string filesUpdate = (string)files.Element("update");

                    foreach (XElement file in files.Elements("file"))
                    {
                        string filename = (string)file.Element("name");
                        string fileUpdate = (string)file.Element("update");

                        dt.Rows.Add(new object[] { name, itemID, filesUpdate, filename, fileUpdate });
                    }
                }
            }

        }

    }
}
0 голосов
/ 03 сентября 2018

Я думаю, что это то, что вы хотите (список объектов, содержащих имя файла и значение обновления):

var lstBooks = loadedData.Descendants("file").Select(x =>
    new {
         FileName = x.Element("name").Value,
         Update = x.Element("update").Value
        }).ToList();

Если вам нужно имя элемента и список обновлений, используйте это:

var lstBooks = loadedData.Descendants("item").Select(x =>
    new {
         FileName = x.Element("name").Value,
         Update = x.Elements("files").Select(y => y.Element("update").Value).ToList(),
        }).ToList();
...