/ / Odczytaj wartość jednego określonego węzła w xml - xml, linq-to-xml

Odczytaj wartość jednego określonego węzła w xml - xml, linq-to-xml

Mam plik xml jak poniżej:

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

Każdy tag istnieje dokładnie jeden raz w tym pliku XMLplik. Chcę napisać tytuł odcinka na etykiecie przy użyciu Linq. Jaki jest najłatwiejszy sposób na zrobienie tego? Znam dokładnie nazwę węzła i istnieje tylko jeden raz. Powinien działać bez żadnych pętli lub czegoś takiego, nie powinien tego robić?

Myślałem o czymś takim:

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

ale Elements nie ma wartości Value.

Ten działa, ale czy nie mogę tego napisać w mniej liniach?

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

Odpowiedzi:

0 dla odpowiedzi № 1

Wartość zwracana Elements() jest sekwencją (szeregiem wartości), dlatego nie ma jej Value własność. Jeśli wiesz, że będzie co najwyżej jedna wartość, możesz użyć First() lub FirstOrDefault() aby wybrać tę wartość. Oto krótki program, który wyciąga wartość "Tytuł":

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

Zwykle wolę używać FirstOrDefault() jeśli istnieje możliwość, że brakuje wartości w xml; Inaczej First() rzuci wyjątek.

Jeśli nie chcesz sprawdzać wartości zerowej (i szukasz 1-liniowej), możesz użyć DefaultIfEmpty() po wybraniu wartości:

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