如何使用Linq从XML创建父节点和子节点的单个列表

问题描述 投票:0回答:2

我需要从一个xml文件创建单个列表,其中有一些来自Parent和Some节点使用Linq的值,然后我需要在UI的单个列表视图中绑定此列表

<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>

代码我写的文件名正确显示但在更新值不返回

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();
    }
c# xml linq datamodel
2个回答
0
投票

我想这就是你想要的(包含文件名和更新值的对象列表):

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();

0
投票

您必须创建一个平面数据表并填写所有列,如下面的代码:

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 });
                    }
                }
            }

        }

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.