LINQ to XML - How does it work?

2019-03-15 12:33发布

问题:

My question is essentially a simple one, though I'm looking for as in-depth an answer possible here: how does LINQ to XML work behind the scenes?

Now, I have had a fair amount of experience working with LINQ to XML for various applications, so it's interfaces is nothing strange to me, but I am quite clueless as to how the internals operate. Now, I do have some understanding of generally how LINQ providers work (implementing IQueryable and IQueryProvider and utilising the visitor pattern, in essence). However, I haven't been able to discover anything about the LINQ provider for LINQ to XML - even messing around with Reflector didn't get me anywhere, though perhaps I was missing the obvious. Most interestingly, I wasn't able to find any evidence of a LINQ provider (implementation of IQueryProvider) within the System.Xml.Linq assembly/namespace.

From observing the LINQ to XML model, it has struck me as a rather unique form of LINQ in that LINQ queries and the associated syntax don't seem quite so integral to the technology, and it rather seems to be based more around a queryable DOM model that provides a lot of useful extension methods. So really, what I would firstly like to know is, does LINQ to XML even have a query provider in the standard sense (that LINQ to SQL has for example), or is it essentially a framework with extension methods on top of which you can use LINQ to Objects to facilitate usage. In addition, I'm also curious how the parsing/conversion from XML code to the DOM hierarchy is done - is XDocument qutie similar to the old XmlDocument in this sense? Does it use an XmlReader or such behind the scenes to parse and interpret the document upon load?

This is very much an open ended question, so any sort of information regarding how LINQ to XML operates behind the scenes would be most welcome. My intention here is primarily to build up a picture of how this specific LINQ technology was designed so that I might subsequently attempt to emulate it myself for a format with similar structure to XML.

回答1:

LINQ to XML is really just LINQ-to-Objects, that work on objects representing XML. So when you write a LINQ query to retrieve nodes from an XDocument (for example), you are actually just invoking extension methods that returns IEnumerable<T>'s, and invoking the standard query operators as they are defined for IEnumerable<T>.

So, one could say that LINQ-to-XML mostly consists of the XElement family of XML-representing classes and the many extension methods that are provided for those, in order to make queries easier.

This is also explained here.