Hay cosas que no es que sean tontas, si no que son tan, tan sencillas que en ningún lado las publican porque es de nivel 100 o menor.
Y aquí es una de ellas que me ha hecho perder un par de horas: Navegar por el esquema de un Xdocument para acceder a la primer nodo que está dentro de un array, que a su vez está en un esquema mayor. Y que, es en donde está la dificultad, se llama igual que el nodo de otro array.
Algo así:
<ListOfDatos'>
<Datos_Telefonos>
<Datos_Telefonos>
<Telefono>658965645</Telefono>
</Datos_Telefonos>
<Datos_Telefonos>
<Telefono>983983983</Telefono>
</Datos_Telefonos>
</Datos_Telefonos>
</ListOfDatos_Telefonos>
<ListOfDatos_Telefono_Movil>
<Datos_Telefono_Movil>
<Datos_Telefono_Movil>
<Telefono>677448137</Telefono>
</Datos_Telefono_Movil>
</Datos_Telefono_Movil>
</ListOfDatos_Telefono_Movil>
Que a su vez está dentro de un esquema mucho mayor con, al menos, 6 niveles por encima.
Lo primer es que Linq to XML es una maravilla y me permite acceder directamente al nodo que quiero situar como punto de partida, sin navegación XPath ni horrores similares:
var elemento= (from XElement xmlElemento in xmlDocument.Descendants("Datos_Telefonos")
.Descendants("Telefono")
select xmlElemento).FirstOrDefault();
Así le puedo indicar que me traiga los descendientes (un IENumerable de XElement) desde el nodo “Datos_Telefonos”, y que a partir de allí me traiga todos los nodos descendientes con el nombre “Telefono”.
Y como solo quiero el primero (si, es un requisito muy raro, pero real), le hago un FirstOrDefault, y ya tengo mi XElement del que sacar, por ejemplo, el Value.
Un último consejo, como puede ser que el Xdocument varié en el tiempo, sería bueno ponerle un control de null a la variable elemento, para que algo como elemento.Value no produzca una rotura, al no existir ese nombre de nodo en el esquema.
Espero que sea útil.