Compara fragmentos XML y devuelve las diferencias

Tengo una lista de auditoría llena de objetos serializados, y me gustaría compararlos y devolver una lista de las diferencias. Por 'comparar' quiero decir que quiero volver donde el texto para un elemento ha cambiado, o donde se ha agregado un nodo (por lo tanto, no está en Xml1, pero está en Xml2, no ocurrirá al revés)

Muestra xml:

<HotelBookingView xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>119</Id>
  <RoomId>1</RoomId>
  <ChangeRequested>false</ChangeRequested>
  <CourseBookings>      
    <CourseHotelLink>
      <Id>0</Id>
    </CourseHotelLink>
</CourseBookings>
</HotelBookingView>

Los espacios de nombres y los nombres / casos de las etiquetas no cambiarán. Todo lo que puede cambiar en esta muestra son los valores entre las etiquetas y el número de 'CourseHotelLink's' (es una lista serializada).

El resultado final que me gustaría es una lista de qué nodo ha cambiado: el valor anterior y el nuevo.

¿Cuál es la mejor opción para compararlos? Estoy usando .Net 4.0, entonces linq es una opción. Necesito poder hacer la comparación sin necesariamente conocer los nombres de todos los nodos, aunque solo compararé dos objetos del mismo tipo. He estado tratando de usar el siguiente código, pero no puedo adaptarlo para seleccionar cambios en el texto así como en nodos adicionales.

XmlDocument Xml1 = new XmlDocument();
XmlDocument Xml2 = new XmlDocument();
Xml1.LoadXml(list[1].Changes);
Xml2.LoadXml(list[2].Changes);
foreach (XmlNode chNode in Xml2.ChildNodes)
{
   CompareLower(chNode);
}

protected void CompareLower(XmlNode aNode)
{
    foreach (XmlNode chlNode in aNode.ChildNodes)
    {
        string Path = CreatePath(chlNode);
        if (chlNode.Name == "#text")
        {
            //all my efforts at comparing text have failed
            continue;
        }
        if (Xml1.SelectNodes(Path).Count == 0)
        {
            XmlNode TempNode = Xml1.ImportNode(chlNode, true);
            //node didn't used to exist, this works- though doesn't return values
            str = str + "New Node: " + TempNode.Name + ": " + TempNode.Value;
        }
        else
        {
            CompareLower(chlNode);
        }
    } 
}

Es probable que mis intentos de código estén a millas de distancia y hay una manera mucho mejor de hacer, ¡cualquier sugerencia es bienvenida!

EDITADO para agregar: terminé usando la herramienta MS Xml Diff Tool, el siguiente código produce una gran tabla html con los dos nodos xml, con las diferencias resaltadas en verde. Por lo tanto, es posible (aunque insano) producir el html, luego clasificarlo para encontrar el texto 'verde claro' (el valor resaltado), luego hacer algunas formaciones de cadena para mostrar solo el nodo secundario cambiado.

var node1 = XElement.Parse("Xml string 1 here").CreateReader();
var node2 = XElement.Parse("Xml string 2 here").CreateReader();

MemoryStream diffgram = new MemoryStream();
XmlTextWriter diffgramWriter = new XmlTextWriter(new StreamWriter(diffgram));

XmlDiff xmlDiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder);
xmlDiff.Algorithm = XmlDiffAlgorithm.Fast;
xmlDiff.Compare(node1, node2,diffgramWriter);

diffgram.Seek(0, SeekOrigin.Begin);
XmlDiffView xmlDiffView = new Microsoft.XmlDiffPatch.XmlDiffView();
StringBuilder sb = new StringBuilder();
TextWriter resultHtml = new StringWriter(sb);
xmlDiffView.Load("Xml string 1", new XmlTextReader(diffgram)); 

xmlDiffView.GetHtml(resultHtml);
resultHtml.Close();