Pregunta

Mi XML se parece a:

<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>

Y mi código hasta ahora es:

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~/files/{0}/text.xml", "en")));

if (doc != null)
{
    XElement element = doc.Elements().Where(e => e.Elements().Any() && e.Attribute("name").Value == "someKey").First();
}

Recibo un error que dice:

Sequence contains no elements

Es mi consulta mal?

Di un paso a través del código, y él los errores hacia fuera en la línea con XElement ..

¿Fue útil?

Solución

¿Quieres algo como esto:

var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();

Editar: Editado para agarrar primer elemento de resultado;

Otros consejos

También es posible usar:

var element = doc.Elements()
                 .Elements()
                 .Where(e => (e.Elements().Any() 
                              && e.Attribute("name").Value == "somekey"))
                 .First();

Explicación:

El doc.Elements() agarra el elemento raíz, que es nodes. A continuación, el .Elements() selecciona los elementos secundarios de eso, que es sólo uno, node. El .Where() se lleva a cabo a continuación, en ese conjunto de nodos, que es lo que desea. La lambda selecciona aquellos elementos que tienen elementos secundarios, y también tienen un atributo "name" con el valor "somekey".

Su código original no estaba recibiendo los Niños de Familias-elementos. Por lo tanto el resultado original establecido estaba vacío.

También puede hacer esto con .Descendants() pero que se siente un poco descuidada y floja, a mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top