web-dev-qa-db-fra.com

utiliser LINQ sur XmlNodeList

<X version="1.0">
  <Y id="abc" abv="a"/>
  <Y id="edf" abv="e"/>
</X>

Je veux sélectionner le nœud dont l'id est "abc" et retourner son abv "a".

XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XmlNodeList list = doc.SelectNodes("X/Y");
var node = list.Cast<XmlNode>().Where(node => node["id"].InnerText == "abc")
                               .Select(x=>x["abv"].InnerText);

Mais cela ne fonctionne pas, noeud ["id"]. InnerText est toujours "". Pouvez-vous indiquer où se situe un problème?

Merci beaucoup

18
ZHE.ZHAO

InnerText pour un nœud est le texte qui apparaît entre <node> et </node>. Donc, par exemple <Y attributes /> il n'y a pas de texte interne.

Vous devez utiliser node => node.Attributes["id"].Value == "abc"

6
David Arno

Mis à part le fait que votre extrait de code ne serait pas compilé en raison de la variable node non unique (d'abord en dehors de la requête linq et deuxième dans la méthode "where" lambda), vous avez également manqué Attributes dans votre requête.

Cela devrait être quelque chose comme

var node = list.Cast<XmlNode>()
               .Where(n => n.Attributes["id"].InnerText == "abc")
               .Select(x => x.Attributes["abv"].InnerText);
21
Andy Korneyev

Il suffit de lancer XmlNodeList en liste, comme ça:

            List<XmlNode> list = new List<XmlNode>();

            foreach(XmlNode a in xmlNodeList)
            {
                list.Add(a);
            }
            list.OrderBy((element) => element.ChildNodes[0].InnerText);
0
Bartosz546