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 ..

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top