Простой способ найти ближайшего общего предка - собрать всех предков первого элемента в хэш-набор, а затем найти первого предка второго элемента в наборе:
XElement element1 = ...
XElement element2 = ...
var ancestors = new HashSet<XElement>(element1.Ancestors());
var common = element2.Ancestors().First(a => ancestors.Contains(a));
Этот подход эффективен для небольшого числа запросов относительно небольших наборов данных XML.Если ожидается, что число запросов для самого низкого общего предка будет большим, вам может потребоваться более продвинутый алгоритм для решения проблемы LCO.