LINQ to XML - Как это работает?

Мой вопрос по существу простой, хотя я ищу как можно более подробный ответ: как LINQ to XML работать за кулисами?

Теперь у меня был довольно большой опыт работы с LINQ to XML для различных приложений, поэтому интерфейс для меня ничего не странен, но я совершенно не знаю, как работают внутренние элементы. Теперь у меня есть некоторое представление о том, как работают LINQ-провайдеры (реализация IQueryable и IQueryProvider и, по существу, использование шаблона посетителя). Тем не менее, я не смог ничего узнать о LINQ-провайдере для LINQ to XML. Даже возиться с Reflector не получило нигде, хотя, возможно, мне не хватало очевидного. Самое интересное, что я не смог найти никаких доказательств поставщика LINQ (реализация IQueryProvider) в рамках сборки/пространства имен System.Xml.Linq.

Отслеживая модель LINQ to XML, она поразила меня как довольно уникальную форму LINQ в том, что запросы LINQ и связанный с ними синтаксис не кажутся настолько неотъемлемой частью этой технологии, и это скорее похоже на большее запрашиваемая модель DOM, которая предоставляет множество полезных методов расширения. Так что, в первую очередь, мне хотелось бы знать, что LINQ to XML даже имеет поставщик запросов в стандартном смысле (например, LINQ to SQL), или это, по существу, структура с методами расширения, поверх которых вы можете используйте LINQ to Objects для облегчения использования. Кроме того, мне также интересно, как выполняется синтаксический анализ/преобразование из XML-кода в иерархию DOM - это XDocument qutie, похожее на старое XmlDocument в этом смысле? Использует ли XmlReader или такой за кулисами для анализа и интерпретации документа при загрузке?

Это очень открытый вопрос, поэтому всякая информация о том, как LINQ to XML работает за кулисами, будет наиболее желанной. Мое намерение здесь в первую очередь состоит в том, чтобы создать картину того, как была разработана эта конкретная технология LINQ, чтобы впоследствии я попытался ее эмулировать для формата с аналогичной структурой с XML.

Ответ 1

LINQ to XML - это просто LINQ-to-Objects, которые работают с объектами, представляющими XML. Поэтому, когда вы пишете запрос LINQ для извлечения узлов из XDocument (например), вы на самом деле просто вызываете методы расширения, которые возвращают IEnumerable <t> , и вызывают стандартные операторы запроса, поскольку они определены для IEnumerable <T> .

Итак, можно сказать, что LINQ-to-XML в основном состоит из семейства XElement из XML-представляющих классов и многих методов расширения, которые предоставляются для них, чтобы упростить запросы.

Это также объясняется здесь.