gpt4 book ai didi

c# - LINQ:如何返回所有子元素?

转载 作者:数据小太阳 更新时间:2023-10-29 02:36:46 26 4
gpt4 key购买 nike

对于我正在处理的应用程序,我必须显示来自 XML 文件的数据。进行了一些转换,但最终结果将显示在 TreeView 中。当用户随后单击节点时,我想在 ListView 中弹出详细信息。

当没有选择节点时,我基本上使用 LINQ 来抓取我遇到的第一个项目的详细信息。

这是我的 XML 的简化版本

<root>
<parent label="parent1">
<child label="child1">
<element1>data</element1>
<element2>data</element2>
...
</child>
<child label="child2">
<element1>data</element1>
<element2>data</element2>
...
</child>
</parent>
</root>

下面是用于获取它的代码(在选择 TreeView 已通过 XPAthSelectStatement 设置的父节点之后):

protected void listsSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
XElement rootElement = XElement.Load(MapPath(TreeSource.DataFile));
rootElement = rootElement.XPathSelectElement("//parent[@label='parent1']");
XElement parentElement;

parentElement = rootElement;

var query = (from itemElement in parentElement.Descendants("child")
select new
{
varElement1 = itemElement.Element("element1").Value,
varElement2 = itemElement.Element("element2").Value,
...
}).Take(1);

e.result = Query;
}

这很有用,我可以从那里读出 varElement1varElement2 值。但是,当我尝试为用户实际选择节点时实现类似的机制时,我似乎遇到了困难。

我的方法是使用另一个 XPatchSelectStatement 到达实际节点:

parentElement = rootElement.XPathSelectElement("//child[@label='" + tvwChildren.SelectedNode.Text + "']");

但我对现在如何获得正确的 LINQ 查询感到困惑,该查询被构建为读取嵌套在子节点下的所有元素。我尝试使用 parentElement.Elements(),但这会产生错误。我还查看了使用 Nodes(),但结果相似。

我想我可以使用 foreach 循环来访问节点,但是我不确定如何将结果放入 LINQ 查询中以便我可以返回相同的 e.Result = query回来。

正如您可能已经猜到的那样,我是 LINQ 的新手,因此非常感谢任何提示。

最佳答案

这是将为您提供子元素的查询(假定只有一个 child 元素具有指定的标签):

var childElement = rootNode.Descendants("child")
.Single(e=>e.Attribute("label").Value == "child1");

如果您有多个带有 label="child1"child 元素,但这些元素位于不同的 parent 元素下,您可以使用使用相同的方法首先获取 parent 元素,然后获取 child 元素。

有了上面的内容,您可以使用此查询来获取 child 节点下的所有 element 节点:

var elements = childElement.Descendants().Select(e=>e.Value);

关于c# - LINQ:如何返回所有子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11008518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com