Pourquoi pas cette requête XElement travaille sur mon xml
-
18-09-2019 - |
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 ..
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.