2011-03-24 26 views
4

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

我知道,我也许可以做到这一点通过获取该元素的所有子节点和转换是IEnumerableList,但已经听起来像它会增加一个高度冗余的开销(因为我只在单一感兴趣子节点)。

有什么我的文档中错过了什么?

回答

5

没有,还有就是使用XElementXContainer一个子元素没有索引访问。如果你想索引访问,你有两个选择。

首先是呼吁XContainerElements方法(其在文档顺序返回XElementIEnumerable<T>一个实例),然后使用Skip extension method跳过元件到达特定子。

如果你想通过指数常访问的子元素,那么你应该把它们放在一个IList<T>(有索引访问),这与ToList extension method很容易:

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

谢谢,所以没有更简单的方法:) - 我决定现在稍微重构一下我的数据结构。我不再一次性处理XML,而是将XML解析成一个特殊的数据结构(存储在列表中,所以我有随机访问),然后使用LINQ来处理这些对象而不是XML。无论如何,这对我以后的工作可能会更好。 – poke 2011-03-24 13:33:56

+0

@poke:这可能会更好,因为XML只是一些其他概念的表示。通常情况下,存储介质和概念的表示并不总是一致的,所以总有这样的转换是很好的,所以你并不总是弯曲你所坚持的限制。 – casperOne 2011-03-24 13:38:36

2

也许拿(TOPN )LINQ指令可以帮助吗? 我基于一些SQL相关经验进行了假设 - 您不能直接获取该行,但可以获取最前n个元素。

这可以帮助,如果你的列表是巨大的,你不encount最后的元素。

4

跳过(n).Take(1)运算符