Perché non è questa query XElement lavorando sul mio xml
-
18-09-2019 - |
Domanda
Il mio xml assomiglia:
<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>
E il mio codice finora è:
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();
}
sto ottenendo un errore che dice:
Sequence contains no elements
È la mia domanda non va?
Ho fatto un passo attraverso il codice, e gli errori sulla linea con XElement ..
Soluzione
Si desidera qualcosa di simile:
var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();
Modifica A cura di afferrare primo elemento da frutto;
Altri suggerimenti
Si potrebbe anche usare:
var element = doc.Elements()
.Elements()
.Where(e => (e.Elements().Any()
&& e.Attribute("name").Value == "somekey"))
.First();
Spiegazione:
Il doc.Elements()
afferra l'elemento radice, che è nodes
. Poi il .Elements()
seleziona gli elementi figlio di quello, che è uno solo, node
. Il .Where()
viene quindi eseguita su quella serie di nodi, che è ciò che si desidera. Il lambda seleziona gli elementi che hanno elementi figlio, e hanno anche un attributo "nome" con valore "somekey".
Il tuo codice originale non è stato sempre il bambino-di-bambini-elementi. Da qui il risultato originale impostato era vuoto.
Si potrebbe anche fare questo con .Descendants()
ma che si sente un po 'sciatto e sciolto, per me.