none
Comprobar nodo RRS feed

  • Pregunta

  • Buenas tardes. Soy un poco nuevo en esto de linq y tengo una pequeña consulta.

    Estoy leyendo un archivo xml y quería saber si hay alguna forma de que no me dé error la consulta en caso de que no exista un determinado nodo. La consulta es así:

    List<AlmacenDatos> resultadoPlace = (from texto in documento.Descendants("result") select new AlmacenDatos

    { nombre = texto.Element("name").Value.ToUpper(), id=texto.Element("type").Value, activity = texto.Element("icon").Value }).ToList();


    Es decir, si por ejemplo no existe el nodo "icon", que en el campo activity rellenase "sin icono"..

    Gracias y un saludo

    viernes, 20 de diciembre de 2013 15:02

Respuestas

  • Hola Robothck,

    Si que puedes, puedes hacer una operación ternaria para comprobar el valor, y rellenar o no en función de si existe o no. Algo así:

     List<AlmacenDatos> resultadoPlace = (from texto in documento.Descendants("result") select new AlmacenDatos   
                   {       
                   nombre = texto.Element("name").Value.ToUpper(),
                   id=texto.Element("type").Value,
                   activity = (texto.Element("icon") != null) ? texto.Element("icon").Value : "Aqui el valor que tu quieras por defecto"
                   }).ToList();

    Por si no las habías visto antes, las operaciones ternarias comprueban la condición del paréntesis, exactamente igual que un if, si la condición es cierta, devuelve el primer valor, y si es falsa, el segundo. Como puedes ver los valores están separados por : .

    Como consejo te diré que a no ser que vayas a utilizar alguna función o propiedad especifica de la colección List, o a utilizar indices, no hace falta que la pases a List. Puedes trabajar perfectamente con IEnumerables para seguir haciendo consultas Linq o recorridos con foreach. Te lo digo porque la función ToList() lo que hace es volver a recorrer los datos para meterlos en una lista, y a no ser que vayas a utilizar algo especifico como te he dicho antes, no vale la pena.

    Espero que te sirva, salu2!!


    Jose Alberto Marti


    • Editado Jose Alberto Marti viernes, 20 de diciembre de 2013 16:00
    • Marcado como respuesta Robothck viernes, 20 de diciembre de 2013 20:48
    viernes, 20 de diciembre de 2013 15:54

Todas las respuestas

  • Hola Robothck,

    Si que puedes, puedes hacer una operación ternaria para comprobar el valor, y rellenar o no en función de si existe o no. Algo así:

     List<AlmacenDatos> resultadoPlace = (from texto in documento.Descendants("result") select new AlmacenDatos   
                   {       
                   nombre = texto.Element("name").Value.ToUpper(),
                   id=texto.Element("type").Value,
                   activity = (texto.Element("icon") != null) ? texto.Element("icon").Value : "Aqui el valor que tu quieras por defecto"
                   }).ToList();

    Por si no las habías visto antes, las operaciones ternarias comprueban la condición del paréntesis, exactamente igual que un if, si la condición es cierta, devuelve el primer valor, y si es falsa, el segundo. Como puedes ver los valores están separados por : .

    Como consejo te diré que a no ser que vayas a utilizar alguna función o propiedad especifica de la colección List, o a utilizar indices, no hace falta que la pases a List. Puedes trabajar perfectamente con IEnumerables para seguir haciendo consultas Linq o recorridos con foreach. Te lo digo porque la función ToList() lo que hace es volver a recorrer los datos para meterlos en una lista, y a no ser que vayas a utilizar algo especifico como te he dicho antes, no vale la pena.

    Espero que te sirva, salu2!!


    Jose Alberto Marti


    • Editado Jose Alberto Marti viernes, 20 de diciembre de 2013 16:00
    • Marcado como respuesta Robothck viernes, 20 de diciembre de 2013 20:48
    viernes, 20 de diciembre de 2013 15:54
  • Hola Jose Alberto,

    antes que nada quería agradecerte muchísimo tu respuesta, me ha servido de mucha ayuda. La verdad que no había caído en que podría utilizar una operación ternaria.

    Revisaré lo que me comentas de IEnumerables.

    De nuevo, gracias.

    Un saludo

    viernes, 20 de diciembre de 2013 20:50