对 XElement 的子节点的索引访问

Posted

技术标签:

【中文标题】对 XElement 的子节点的索引访问【英文标题】:Indexed access to XElement‘s child nodes 【发布时间】:2011-07-22 02:31:04 【问题描述】:

我正在使用 LINQ to XML 和 XDocument 解析 XML 文档。 XElement/XContainer 有没有办法通过索引(按文档顺序)获取子节点?这样我就可以得到元素的nth 节点?

我知道我可以通过获取该元素的所有子节点并将 IEnumerable 转换为 List 来做到这一点,但这听起来已经增加了高度冗余的开销(因为我只对单个子节点)。

我在文档中遗漏了什么吗?

【问题讨论】:

【参考方案1】:

不,没有使用XElementXContainer 对子元素的索引访问。如果您想要索引访问,您有两种选择。

首先是在XContainer 上调用Elements 方法(它按文档顺序返回XElement 实例的IEnumerable<T>),然后使用Skip extension method 跳过元素以到达特定的子元素.

如果您想经常通过索引访问子元素,那么您应该将它们放在IList<T>(具有索引访问)中,使用ToList extension method 很容易:

IList<XElement> indexedElements = element.Elements().ToList();

【讨论】:

谢谢,没有更简单的方法了 :) – 我决定现在稍微重构一下我的数据结构。我不会一直处理 XML,而是将 XML 解析为一个特殊的数据结构(存储在列表中,所以我可以随机访问),然后使用 LINQ 处理这些对象而不是 XML。无论如何,这对我以后的工作可能会更好。 @poke:这可能会更好,因为 XML 只是其他一些概念的表示。通常,存储介质和概念的表示并不总是一致的,所以进行这样的转换总是好的,这样你就不会总是绕开你所坚持的限制。【参考方案2】:

Skip(n).Take(1) 运算符呢

【讨论】:

【参考方案3】:

也许 Take(topN) LINQ 指令可以提供帮助? 我根据一些与 SQL 相关的经验做出假设 - 您不能直接获取该行,但可以获取前 n 个元素。

如果您的列表很大并且您没有遇到最后的元素,这会有所帮助。

【讨论】:

以上是关于对 XElement 的子节点的索引访问的主要内容,如果未能解决你的问题,请参考以下文章

XElement 怎么在指定节点添加子节点

XElement => 在运行时添加子节点

使用 xpath 访问具有命名空间的子节点

域驱动设计:如何访问聚合根的子节点

delphi中的treeview控件如何取到选择节点的索引号?

属性名称在Xelement的setattribute属性中重叠