Warum ist das nicht XElement Abfrage der Arbeit an meinem xml
-
18-09-2019 - |
Frage
Meine xml wie folgt aussehen:
<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>
Und mein Code so weit ist:
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();
}
Ich erhalte eine Fehlermeldung, dass:
Sequence contains no elements
Ist meine Frage falsch?
ich durch den Code trat, und es Fehler heraus auf der Linie mit XElement ..
Lösung
Sie wollen etwas wie folgt aus:
var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();
Edit: Edited erstes Element aus dem Ergebnis zu greifen;
Andere Tipps
Sie können auch verwendet werden:
var element = doc.Elements()
.Elements()
.Where(e => (e.Elements().Any()
&& e.Attribute("name").Value == "somekey"))
.First();
Erklärung:
Die doc.Elements()
greift das Stammelement, das nodes
ist. Dann wählt der .Elements()
die untergeordneten Elemente davon, die nur eine ist, node
. Die .Where()
wird dann an diesem nodeset ausgeführt, das ist das, was Sie wollen. Die Lambda wählt die Elemente, die Kind-Elemente haben, und haben auch ein Attribut „name“ mit dem Wert „somekey“.
Ihr Original-Code wurde nicht immer die Child-of-Child-Elemente. Daraus ergibt sich die ursprüngliche Ergebnismenge leer war.
Sie können auch dies mit .Descendants()
aber das fühlt sich ein wenig schlampig und locker, zu mir.