XElement的子节点索引访问

4
我正在使用LINQ to XML和XDocument解析XML文档。有没有办法通过索引(按照文档顺序)获取XElement / XContainer的子节点?这样我就可以获取元素的第n个节点?
我知道我可能可以通过获取该元素的所有子节点并将该IEnumerable转换为List来实现,但这听起来已经增加了高度冗余的开销(因为我只关心一个单独的子节点)。
在文档中是否有我忽略的内容?
3个回答

5

不,使用XElementXContainer没有对子元素进行索引访问的功能。如果您需要索引访问,有两个选择。

第一种方法是在XContainer上调用Elements方法(它按文档顺序返回XElement实例的IEnumerable<T>),然后使用Skip扩展方法跳过元素以到达特定的子元素。

如果您经常需要按索引访问子元素,则应将它们放入IList<T>(具有索引访问权限),这很容易通过ToList扩展方法实现:

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

谢谢,所以没有更简单的方法 :) - 我决定稍微重构我的数据结构。不再一直在XML上工作,而是将XML解析一次到一个特殊的数据结构中(存储在列表中,因此我有随机访问),然后使用LINQ来处理这些对象,而不是XML。这对于我的后续工作可能更好。 - poke
@poke:这样可能更好,因为XML只是某个概念的表示。通常,存储介质和概念的表示并不总是一致的,因此拥有这样的转换总是很好的,这样你就不必总是围绕着持久化的限制弯曲了。 - casperOne

4

关于Skip(n).Take(1)操作符怎么样?


2
也许使用Take(topN) LINQ指令可以帮助你? 根据一些与SQL相关的经验,我做出了假设 - 你不能直接获取行,但是可以取前n个元素。 如果你的列表很大且你没有遇到最后一个元素,这将会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接