/ / Liest den Wert eines bestimmten Knotens in einer xml - xml, linq-to-xml

Lesen Sie den Wert eines bestimmten Knotens in einem xml - xml, linq-to-xml

Ich habe eine XML-Datei wie diese:

<Item>
<Season>01</Season>
<EpisodeNumber>01</EpisodeNumber>
<EpisodeTitle>Title</EpisodeTitle>
</Item>

Jedes Tag existiert genau einmal in dieser XMLDatei. Ich möchte den Episodentitel mit Linq in ein Label schreiben. Was ist der einfachste Weg, dies zu tun? Ich kenne den Namen des Knotens genau und er existiert nur einmal. Es sollte ohne for-Schleifen oder ähnliches funktionieren, nicht wahr?

Ich dachte über so etwas nach:

XDocument xml = XDocument.Load(xmlPath);
string info = xml.Elements("EpisodeName").Value;
label1.Text = info;

Aber Elements hat keine Methode Value.

Dieser funktioniert, aber kann ich das nicht in weniger Zeilen schreiben?

XDocument xml = XDocument.Load(xmlPath);
var info = xml.Descendants("EpisodeName");
foreach (string line in info)
{
label1.Text = line;
}

Antworten:

0 für die Antwort № 1

Der Rückgabewert Elements() ist eine Folge (eine Reihe von Werten), weshalb es keine hat Value Eigentum. Wenn Sie wissen, dass es höchstens einen Wert gibt, können Sie verwenden First() oder FirstOrDefault() um diesen Wert auszuwählen. Hier ist ein kurzes Programm, das den "Title" -Wert herausholt:

static void Main()
{
// I am loading the value from a string just for example; you can do XDocument.Load instead
var xml = @"
<Item>
<Season>01</Season>
<EpisodeNumber>01</EpisodeNumber>
<EpisodeTitle>Title</EpisodeTitle>
</Item>";
var xdoc = XDocument.Parse(xml);

// this is the statement which extracts the first EpisodeTitle xml element without iterating
var titleElem = xdoc.Root
.Elements("EpisodeTitle")
.FirstOrDefault();

// check to makes sure the element exists before calling .Value
label1.Text = (titleElem == null) ? string.Empty : titleElem.Value;
}

Ich bevorzuge normalerweise zu verwenden FirstOrDefault() wenn die Möglichkeit besteht, dass der Wert in der XML fehlt; Andernfalls First() wird eine Ausnahme auslösen.

Wenn Sie nicht nach Null suchen möchten (und nach einem Einzeiler suchen), können Sie verwenden DefaultIfEmpty() Nach Auswahl des Wertes:

label1.Text = xdoc.Root.Elements("EpisodeTitle2").Select(e => e.Value).DefaultIfEmpty().FirstOrDefault();