/ / Lire la valeur d'un nœud spécifique dans un xml - xml, linq-to-xml

Lire la valeur d'un noeud spécifique dans un fichier xml - xml, linq-to-xml

J'ai un fichier XML comme ceci:

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

Chaque balise existe exactement une fois dans ce xmlfichier. Je veux écrire le titre de l'épisode dans une étiquette en utilisant Linq. Quelle est la manière la plus simple de faire ça? Je connais exactement le nom du nœud et il n'existe qu'une seule fois. Il devrait fonctionner sans boucles ni autre chose, non?

J'ai pensé à quelque chose comme ça:

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

mais Elements n'a pas de méthode Value.

Celui-ci fonctionne, mais ne puis-je pas écrire cela en moins de lignes?

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

Réponses:

0 pour la réponse № 1

La valeur de retour Elements() est une séquence (une série de valeurs), c'est pourquoi elle n'a pas Value propriété. Si vous savez qu'il y aura au plus une valeur, vous pouvez utiliser First() ou FirstOrDefault() pour sélectionner cette valeur. Voici un petit programme qui extrait la valeur "Title":

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

Je préfère généralement utiliser FirstOrDefault() s'il y a une possibilité que la valeur manque dans le xml; autrement First() va jeter une exception.

Si vous n'aimez pas avoir à vérifier la valeur nulle (et que vous recherchez un 1-liner), vous pouvez utiliser DefaultIfEmpty() après avoir sélectionné la valeur:

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