Mostrando entradas con la etiqueta XML. Mostrar todas las entradas
Mostrando entradas con la etiqueta XML. Mostrar todas las entradas

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.

viernes, 18 de octubre de 2013

Introducir contenido de un XDocument a un XmlReader, en una deserealización

Tengo un Xdocument que contiene la respuesta XML de un webservice. Además tengo una clase empleado que tiene los campos y los decoradores adecuados al esquema para poder hacer una deserialización directa.

Y entonces me veo en el marrón de siempre que tengo que trabajar con stream, el método Deserialize requiere que trabaje con un XmlReader, que en sus tropecientas sobrecargas parte de un stream que, como buen IO, está diseñado principalmente para ser utilizado con un fichero físico.

Después de un buen rato de desesperación, el intellisense me ha dado la solución más simple y obvia, y es que el objeto de tipo XDocument tiene un método llamado CreateReader() que me devuelve un XmlReader…

        public Empleado ToEmpleado(XDocument xmlDocument)
        {
           
var empleado = new Empleado();

           
XmlSerializer serializer = new XmlSerializer(typeof(Empleado));
            empleado = (
Empleado)serializer.Deserialize(xmlDocument.CreateReader());

            return empleado;       
        }

Espero que sea de utilidad.