write read leer ejemplo documentelement create crear c# xml

c# - read - Compruebe si existe un elemento al analizar XML



write xml c# (4)

En lugar de usar la propiedad Value , si lo convierte en una cadena, obtendrá una referencia nula:

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { XDocument dataDoc = XDocument.Load(new StringReader(e.Result)); var listitems = from noticia in dataDoc.Descendants("Noticia") select new News() { id = (string) noticia.Element("IdNoticia"), published = (string) noticia.Element("Data"), title = (string) noticia.Element("Titol"), subtitle = (string) noticia.Element("Subtitol"), thumbnail = (string) noticia.Element("Thumbnail") }; itemList.ItemsSource = listitems; }

Utiliza la conversión explícita de XElement a string , que maneja una entrada nula devolviendo un resultado nulo. Lo mismo es cierto para todas las conversiones explícitas en XAttribute y XElement para tipos anulables, incluidos los tipos de valores que XAttribute XElement , como int? - solo debes tener cuidado si estás usando elementos anidados . Por ejemplo:

string text = (string) foo.Element("outer").Element("inner");

dará una referencia nula si falta inner , pero aún arrojará una excepción si falta outer .

Si quiere un valor "predeterminado", puede usar el operador nulo coalescente ( ?? ):

string text = (string) foo.Element("Text") ?? "Default value";

Estoy analizando XML. Normalmente lo analizo de la forma en que lo muestro en el siguiente código, que es sencillo. El problema es que no soy el propietario del XML que estoy analizando y no puedo modificarlo. Algunas veces no hay un elemento en miniatura (no hay etiquetas) y recibo una Exception .

¿Hay alguna manera de mantener esta simplicidad y verificar si el elemento existe? ¿O debo obtener primero una lista XElement con LINQ, para luego verificarla y completar solo las propiedades existentes del objeto?

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { XDocument dataDoc = XDocument.Load(new StringReader(e.Result)); var listitems = from noticia in dataDoc.Descendants("Noticia") select new News() { id = noticia.Element("IdNoticia").Value, published = noticia.Element("Data").Value, title = noticia.Element("Titol").Value, subtitle = noticia.Element("Subtitol").Value, thumbnail = noticia.Element("Thumbnail").Value }; itemList.ItemsSource = listitems; }


Crea un método de extensión como este:

public static string TryGetElementValue(this XElement parentEl, string elementName, string defaultValue = null) { var foundEl = parentEl.Element(elementName); if (foundEl != null) { return foundEl.Value; } return defaultValue; }

entonces, cambia tu código así:

select new News() { id = noticia.TryGetElementValue("IdNoticia"), published = noticia.TryGetElementValue("Data"), title = noticia.TryGetElementValue("Titol"), subtitle = noticia.TryGetElementValue("Subtitol"), thumbnail = noticia.TryGetElementValue("Thumbnail", "http://server/images/empty.png") };

Este enfoque le permite mantener un código limpio al aislar la verificación de presencia de elementos. También le permite definir un valor predeterminado, que puede ser útil



Puede usar el siguiente código:

string content = item.Element("Content") == null ? "" : item.Element("Content").Value;