我解析使用LINQ to XML和XDocument
的XML文档。有没有办法让XElement
/XContainer
通过索引获取子节点(按文档顺序)?这样我就可以获得元素的第个节点了吗?到的XElement的子索引接入节点
我知道,我也许可以做到这一点通过获取该元素的所有子节点和转换是IEnumerable
到List
,但已经听起来像它会增加一个高度冗余的开销(因为我只在单一感兴趣子节点)。
有什么我的文档中错过了什么?
我解析使用LINQ to XML和XDocument
的XML文档。有没有办法让XElement
/XContainer
通过索引获取子节点(按文档顺序)?这样我就可以获得元素的第个节点了吗?到的XElement的子索引接入节点
我知道,我也许可以做到这一点通过获取该元素的所有子节点和转换是IEnumerable
到List
,但已经听起来像它会增加一个高度冗余的开销(因为我只在单一感兴趣子节点)。
有什么我的文档中错过了什么?
没有,还有就是使用XElement
或XContainer
一个子元素没有索引访问。如果你想索引访问,你有两个选择。
首先是呼吁XContainer
的Elements
方法(其在文档顺序返回XElement
的IEnumerable<T>
一个实例),然后使用Skip
extension method跳过元件到达特定子。
如果你想通过指数常访问的子元素,那么你应该把它们放在一个IList<T>
(有索引访问),这与ToList
extension method很容易:
IList<XElement> indexedElements = element.Elements().ToList();
也许拿(TOPN )LINQ指令可以帮助吗? 我基于一些SQL相关经验进行了假设 - 您不能直接获取该行,但可以获取最前n个元素。
这可以帮助,如果你的列表是巨大的,你不encount最后的元素。
跳过(n).Take(1)运算符
谢谢,所以没有更简单的方法:) - 我决定现在稍微重构一下我的数据结构。我不再一次性处理XML,而是将XML解析成一个特殊的数据结构(存储在列表中,所以我有随机访问),然后使用LINQ来处理这些对象而不是XML。无论如何,这对我以后的工作可能会更好。 – poke 2011-03-24 13:33:56
@poke:这可能会更好,因为XML只是一些其他概念的表示。通常情况下,存储介质和概念的表示并不总是一致的,所以总有这样的转换是很好的,所以你并不总是弯曲你所坚持的限制。 – casperOne 2011-03-24 13:38:36