lunes, 21 de octubre de 2013

Navegar por un Xdocument con Linq to XML

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.

No hay comentarios: