De todas formas si hay una forma mas óptima y alguien quiere postearla es bienvenida.
Código
using System; using System.Data; using System.Linq; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ds.ReadXml("../../XMLFile1.xml"); foreach (DataRow drp in ds.Tables["persona"].Rows) { // Esta columna de la tabla la genera el DataSet no el archivo XML Int32 persona_Id = drp.Field<Int32>("persona_Id"); Console.WriteLine("persona_Id: " + persona_Id); Console.WriteLine("id: " + drp.Field<String>("id")); Console.WriteLine("nombre: " + drp.Field<String>("nombre")); Console.WriteLine("apellido: " + drp.Field<String>("apellido")); var query = from p in ds.Tables["persona"].AsEnumerable() join hs in ds.Tables["hijos"].AsEnumerable() on p.Field<Int32>("persona_Id") equals hs.Field<Int32>("persona_Id") join h in ds.Tables["hijo"].AsEnumerable() on hs.Field<Int32>("hijos_Id") equals h.Field<Int32>("hijos_Id") where p.Field<Int32>("persona_Id") == persona_Id select h; foreach (DataRow drh in query) { Console.WriteLine("Hijo: " + drh.Field<String>("hijo_Text")); } Console.WriteLine(); } Console.ReadLine(); } } }