0

我有一个看起来像这样的 XML 文件:

<?xml version="1.0" encoding="utf-8" ?>
<scripts>
    <script id="1">
        <name>A Script File</name>
        <author>Joe Doe</author>
        <fileDestination>
            <destination>W:\folderolder\</destination>
            <destination>W:\anotherfolder\</destination>
            <destination>W:\athirdfolder\</destination>
        </fileDestination>
    </script>
    <script id="2">
        <name>Another File</name>
        <author>Bobby Doe</author>
        <fileDestination>
            <destination>W:\somefolder\</destination>
            <destination>W:\someotherfolder\</destination>
        </fileDestination>
    </script>
</scripts>

我有一个 LINQ to XML 查询,我在这个SO Question的帮助下制定了这个查询。

    var query3 = (from c in xDoc.Descendants("script")
                          select new
                          {
                              Name = (string)c.Element("name").Value,
                              Author = (string)c.Element("author").Value,
                              //Destination = c.Element("fileDestination").Elements().Select(e => (string)c.Element("destination").Value)
                              //Destination = c.Element("fileDestination").Elements().Where(e => (string)c.Element("destination").Value != null).Select(e => (string)c.Element("destination").Value).ToList()
                              Destination = c.Descendants("fileDestination").Elements().Where(e => c.Element("fileDestination").Element("destination").Value != null).Select( e => (string)c.Element("destination").Value)
                          });

问题是,(1)我总是得到一个 nullreferenceerror 和(2)我不明白如何访问第二次选择的结果。我可以做类似的事情:

        txtScriptTitle.Text = query.FirstOrDefault().Name;
        cmboAuthor.Text = query.FirstOrDefault().Author;

显示前两项的结果,但我不知道如何访问“目的地”。

我最终想要做的是对 XML 文档执行一个 LINQ 查询并将单个结果(在下面的示例中为名称和作者)绑定到单个文本框(txtName 和 txtAuthor),然后将子查询的结果绑定到列表框。我可以在单个查询中执行此操作吗?

4

1 回答 1

0

尝试更改填充Destination为的查询

Destination = c.Descendants("destination")
               .Select(e => e.Value)
               .Where(s => !string.IsNullOrEmpty(s))
               .ToList();

这将使用一个列表填充它,然后您可以将其绑定到您的控件。

于 2013-06-21T18:46:17.787 回答