【问题标题】:How could I create single list from Parent and child node from XML using Linq如何使用 Linq 从 XML 的父节点和子节点创建单个列表
【发布时间】:2019-02-08 09:09:44
【问题描述】:

我需要使用 Linq 从一个 xml 文件创建单个列表,其中有一些来自父节点和一些来自子节点的值,然后我需要将此列表绑定到 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>

我在 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();
    }

【问题讨论】:

  • 你能给出你想要的输出结构吗?现在从你提供的信息看不太清楚

标签: c# xml linq datamodel


【解决方案1】:

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

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

【讨论】:

  • 我想要第二个,但它仍然返回 {System.Collections.Generic.List} }
  • 当然了。您的第一项 AAA 包含两个文件。你想如何区分你想要哪一个?您的 XML 结构非常奇怪,因为它在树的不同部分丢失了重复的元素名称。这就是为什么说你想要哪个元素非常令人困惑的原因!
  • 我认为错误是因为您没有直接在第二个元素的 files 标记内有“update”xml 标记。如果您使用更多不同的 xml 字段名称可能会更容易
  • 我只需要第一个
【解决方案2】:

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

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

        }

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多