web-dev-qa-db-fra.com

Lire des valeurs depuis un XNode

J'ai un code qui me renvoie un XNode qui ressemble à ceci:

<File>
  <Component>Main</Component>
  <Path>C:\Main\</Path>
  <FileName>main.txt</FileName>
</File>

J'ai besoin d'un code C # qui puisse extraire la valeur de Path par exemple (C:\Main). Je sais que si j'utilisais un nœud XML, je pourrais le faire comme ceci:

String filePath = xmlNode["Path"].InnerText;

Est-ce que quelqu'un sait ce que l'équivalent serait pour un XNode? Toute aide est très appréciée!

24
DukeOfMarmalade

Est-ce que vous {avez} _ voulez qu'il retourne une XNode plutôt qu'une XElement? Avec un XElement c'est plus simple qu'avec un XNode:

string filePath = fileElement.Element("Path").Value;

Cela trouvera l'élément premierPath et jettera un NullReferenceException s'il n'en existe pas. Une alternative si vous êtes heureux d'obtenir null s'il n'y en a pas serait:

string filePath = (string) fileElement.Element("Path");

Si vous êtes vraiment coincé avec XNode, vous devrez soit transtyper en XElement ou éventuellement XContainer.

45
Jon Skeet

Vous pouvez convertir votre XNode en XElement pour accéder à ses propriétés, mon exemple:

XNode lastNode = myXElement.LastNode;

//if I want to get the 'ID' attribute
string id = (lastNode as XElement).Attribute("ID").Value;
7
Giu

Vous pouvez utiliser ceci:

XElement xtr = XElement.Load("path/to/your/xml/file");
String filePath = xtr.Descendants("Path").Single().Value;
0
Abdul Munim

Si vous importez System.Xml.XPath, vous pouvez utiliser XPathSelectElement comme ceci sur l'objet XNode:

String component = xmlNode.XPathSelectElement("Component");
String path = xmlNode.XPathSelectElement("Path");
String fileName = xmlNode.XPathSelectElement("FileName");
0
Taegost

La conversion de XNode en XElement permet à l'élément individuel de récupérer sa valeur ou ses attributs. Mais vous ne pourrez pas utiliser myXelement.Elements ("XXX") pour obtenir des éléments imbriqués. Pour cela, vous pouvez utiliser xmlNode.Nodes ().

Cela devrait fonctionner:

var nodes = xmlNode.Nodes();//Get all nodes under 'File'
var fileNameNode = nodes.Where(el => ((XElement)el).Name.LocalName == "FileName")
.FirstOrDefault();
string filePath = ((XElement)fileNameNode).Value;
0
Michael_S_

Cela dépend de ce que les objets classiques sont le résumé XNode. De Classe XNode :

XNode est une classe de base commune abstraite pour les types suivants: XComment XContainer: peut être XDocument ou XElement XDocumentType XProcessingInstruction XText

Vous devez donc vérifier si vous pouvez le convertir en XDocument ou XElement et utiliser leurs méthodes, ou utiliser LINQ to XML:

Par exemple:

0
JotaBe