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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top