Pregunta

todos! No pude encontrar un tutorial que explica la manera correcta de código de esto. Creo que va a quedar claro desde el título y el código de lo que estoy tratando de hacer. Los dos errores que estoy recibiendo es que mi declaración si está en el lugar equivocado, y que se asigna la variable 'Flecha' pero nunca utilizado. Sé que esto se reduce a la sintaxis sencilla, así que gracias a todos por su tiempo.

void DATABASEinfo_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XElement xmlitem = XElement.Parse(e.Result);

        var list = new List<DATABASEinfoViewModel>();            


        foreach (XElement item in xmlitem.Element("channel").Elements("item"))
        {
            var title = item.Element("title");
            var titlevalue = (title == null) ? null : title.Value;
            var description = item.Element("description");
            var descriptionvalue = (description == null) ? null : description.Value;                
            var arrow = (xmlitem.Element("title").Value.Contains("DATABASE Up"))
                ? "up" : null;


            list.Add(new DATABASEinfoViewModel
            {
                Title = titlevalue,
                Description = descriptionvalue,
                Arrow = arrow,                   
            });
        }                       

        DATABASEinfoList.ItemsSource = list;           
    }          

    public class DATABASEinfoViewModel
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Arrow { get; set; } 

Curiosamente, si el cambio I:

var arrow = (xmlitem.Element("title").Value.Contains("DATABASE Up"))

Para:

var arrow = (xmlitem.Element("channel").Value.Contains("DATABASE Up"))

Se muestra "arriba" para todas las entradas. Este es un ejemplo del archivo XML:

<rss version="2.0">
<channel>
<title> DATABASE Status</title>
<description>DATABASE status updates</description>      

<item>
<title>First status is DATABASE Up</title>
<description>First Content</description>
</item>

<item>
<title>Second status is DATABASE Up</title>
<description>Second Content</description>
</item>

</channel>
¿Fue útil?

Solución

La línea

var arrow = (xmlitem.Element("title").Value.Contains("DATABASE Up")) 

debería ser en realidad

var arrow = (item.Element("title").Value.Contains("DATABASE Up")) 

Debe defeto la , no xmlitem .

Como se ha mencionado en otras respuestas, también se debe comprobar que no existen elementos antes de acceder a sus valores.

Otros consejos

Si no devuelve un resultado que se puede asignar a var flecha.

Cuando se trata de hacer algo como esto?

    string arrow = "";
    if (xmlitem.Element("description").Value.Contains("DATABASE Up"))
    {
        arrow = ("up");                
    }   

no es del todo claro para mí lo que estás tratando de hacer. Si el description contiene "base de datos" desea que el valor de arrow como "arriba" de otro modo, ¿qué? nula?

string arrow = null;

if (xmlitem.Element("description").Value.Contains("DATABASE Up")) 
{ 
    arrow = ("up");                 
}                 

o

var arrow = (xmlitem.Element("description").Value.Contains("DATABASE Up"))
            ? "up" : null;

Editar

Y por qué estás poniendo DATABASEinfoList.ItemsSource = list tanto en el interior del bucle foreach y otra vez afuera? El uno en el interior, probablemente, debe desaparecer.

Además, no es un problema inherente, que se muestra por su comentario en la respuesta de Mick .. Estas llamadas:

 item.Element("[elementName]").Value

asume que existe el elemento. Si no es así se llamará la propiedad de captador Value en un nulo, lanzar una NullReferenceException. Si hay una posibilidad de que el elemento sería nula, entonces usted necesita para comprobar que antes de llamar Valor:

 var element = item.Element("[elementName]");
 var value = (element == null) ? null : element.Value;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top