¿Por qué no se esta consulta XElement trabajando en mi xml
-
18-09-2019 - |
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 ..
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í.