Question

Mon xml ressemble:

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

Et mon code à ce jour est:

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();
}

Je reçois une erreur disant:

Sequence contains no elements

est ma requête ne va pas?

je suis entré dans le code, et il des erreurs sur la ligne avec XElement ..

Était-ce utile?

La solution

Vous voulez quelque chose comme ceci:

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

Modifier Edité pour saisir premier élément de résultat;

Autres conseils

Vous pouvez également utiliser:

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

Explication:

Le doc.Elements() saisit l'élément racine, qui est nodes. Ensuite, l'.Elements() sélectionne les éléments enfants de ce qui est juste, node. Le .Where() est ensuite réalisée sur ce nodeset, qui est ce que vous voulez. Le lambda sélectionne les éléments qui ont des éléments de l'enfant, et ont également un attribut « name » avec la valeur « somekey ».

Votre code d'origine ne recevait pas les enfants de-enfants-éléments. D'où le résultat initial fixé était vide.

Vous pouvez aussi le faire avec .Descendants() mais qui se sent un peu bâclée et lâche, pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top