【问题标题】:C# Linq XML Query where multiple elements of same name from a parent node based on a child node valueC# Linq XML Query,其中基于子节点值的父节点中的多个同名元素
【发布时间】:2015-04-29 07:12:33
【问题描述】:

我是一个新手,正在尝试根据下面的 xml 检索文件节点的所有值。

<Changes>
  <Change id="Rest">
    <Name>Restructure</Name>
    <TIDE>
      <Files>
        <File>REGION</File>
      </Files>
    </TIDE>
    <Click>
      <Files>
        <File>DISTRICT</File>
      </Files>
    </Click>
  </Change>
  <Change id="st">
    <Name>New ST</Name>
    <TIDE>
      <Files>
        <File>REGION</File>
      </Files>
    </TIDE>
    <Click>
      <Files>
        <File>DISTRICT</File>
      </Files>
    </Click>
  </Change>
</Changes>

我使用的代码给了我一个错误“序列不包含任何元素”。我试图通过在此论坛上搜索几个示例来构建此代码。谁能帮帮我,不胜感激。

var items = (from i in xmldoc.Root.Elements("Change")
                         where (string)i.Element("Name").Value == listBox1.SelectedValue.ToString()
                         select i).First().Elements("File").ToList();

【问题讨论】:

  • 你的listBox值在xml中有对应的值吗?
  • 是的,列表框包含值 - Restructure 和 New St,根据所选项目,我需要填充另一个列表框。

标签: c# xml linq


【解决方案1】:

此 LINQ 查询返回 Change 节点:

(from i in xmldoc.Root.Elements("Change")
 where (string)i.Element("Name").Value == listBox1.SelectedValue.ToString()
 select i)

... 和 Change 节点没有 direct 子节点 File。在这种情况下,您可以使用Descendants() 而不是Elements()

var items = (from i in xmldoc.Root.Descendants("Change")
             where i.Element("Name").Value == listBox1.SelectedValue.ToString()
             select i).First().Descendants("File").ToList();

【讨论】:

  • 嗨 har07,感谢您的回复,在发帖之前,我什至尝试过与后代一起使用,但也没有成功。这是代码 XDocument xmldoc = XDocument.Load("Change_Files_List.xml"); var items = (from i in xmldoc.Root.Descendants("Change") where (string)i.Element("Name").Value == "Restructure"//listBox1.SelectedValue.ToString() select i).First ().Elements("文件").ToList();
  • var items = (from i in xmldoc.Root.Descendants("Change") where (string)i.Element("Name").Value == "Restructure"//listBox1.SelectedValue. ToString() 选择 i).First().Descendants("File").ToList();
【解决方案2】:

你得到这个错误:

“序列不包含任何元素”

被 First() 方法调用抛出。 First() 期望至少列出一个结果,并且您在 Where 子句中的过滤器正在删除所有结果(可能没有从列表框中正确获取名称)。

我在我的机器上进行了测试,将 listBox1.SelectedValue.ToString() 替换为“Restructure”,并且错误不再发生。

即使没有抛出异常,结果也不如预期,项目列表为空。要解决这个其他问题,您必须遵循 har07 响应,一切都会正常工作。

【讨论】:

  • 谢谢 Lopez,我尝试了你的两个建议,但仍然没有解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多