对 XElement 的子节点的索引访问
Posted
技术标签:
【中文标题】对 XElement 的子节点的索引访问【英文标题】:Indexed access to XElement‘s child nodes 【发布时间】:2011-07-22 02:31:04 【问题描述】:我正在使用 LINQ to XML 和 XDocument
解析 XML 文档。 XElement
/XContainer
有没有办法通过索引(按文档顺序)获取子节点?这样我就可以得到元素的n
th 节点?
我知道我可以通过获取该元素的所有子节点并将 IEnumerable
转换为 List
来做到这一点,但这听起来已经增加了高度冗余的开销(因为我只对单个子节点)。
我在文档中遗漏了什么吗?
【问题讨论】:
【参考方案1】:不,没有使用XElement
或XContainer
对子元素的索引访问。如果您想要索引访问,您有两种选择。
首先是在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 的子节点的索引访问的主要内容,如果未能解决你的问题,请参考以下文章