我的问题本质上是一个简单的问题,虽然我正在寻找可能的深入答案: LINQ to XML如何在幕后工作?
现在,我已经有了相当多的LINQ to XML用于各种应用程序的经验,所以它的接口对我来说并不陌生,但我对内部的运行方式一无所知。现在,我对LINQ提供程序的工作方式有了一些了解(实现IQueryable
和IQueryProvider
并实际使用访问者模式)。但是,我还没有发现任何关于LINQ to XML的LINQ提供程序 - 甚至搞乱Reflector并没有让我到处都有,尽管我可能错过了显而易见的事情。最有趣的是,我无法在IQueryProvider
程序集/命名空间中找到任何LINQ提供程序(System.Xml.Linq
的实现)的证据。
从观察LINQ到XML模型,它让我感到一种相当独特的LINQ形式,因为LINQ查询和相关语法似乎并不是这项技术的重要组成部分,它似乎更多地基于一个可查询的DOM模型,它提供了许多有用的扩展方法。实际上,我首先要知道的是,LINQ to XML甚至是否具有标准意义上的查询提供程序(例如LINQ to SQL),或者它本质上是一个带有扩展方法的框架,您可以在其上使用LINQ to Objects来方便使用。另外,我也很好奇从XML代码到DOM层次结构的解析/转换是如何完成的 - XDocument
qutie在这个意义上类似于旧的XmlDocument
?是否在幕后使用XmlReader
或类似内容来解析和解释文档?
这是一个非常开放的问题,因此任何有关LINQ to XML如何在幕后运行的信息都将受到欢迎。我的目的主要是建立一个如何设计这种特定LINQ技术的图片,以便随后我可以尝试自己模拟一种与XML结构类似的格式。
答案 0 :(得分:13)
LINQ to XML实际上只是LINQ-to-Objects,它处理表示XML的对象。因此,当您编写LINQ查询以从XDocument检索节点时(例如),您实际上只是调用返回IEnumerable< T>的扩展方法,并调用标准查询运算符,因为它们是为IEnumerable< T>定义的。
因此,可以说LINQ-to-XML主要由XML表示类的XElement系列和为其提供的许多扩展方法组成,以便使查询更容易。
这也解释了here。