2011-11-10 5 views
21

ho qualche codice che sta tornando un XNode per me che assomiglia a questo:Lettura di valori da all'interno di un XNode

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

ho bisogno di avere un po 'di codice C# che sarà in grado di tirare fuori il valore di Path per esempio (C: \ Main). So che se stavo usando un nodo XML ho potuto fare in questo modo:

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

Qualcuno sa che cosa l'equivalente sarebbe per un XNode? Ogni aiuto è molto apprezzato!

risposta

42

Hai per restituire un XNode anziché uno XElement? Con una XElement è più semplice che con un XNode:

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

che troverà l'elemento primaPath, e lancerà un NullReferenceException se non ce ne sono. Un'alternativa se sei felice di ottenere null se non ci sono sarebbe:

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

Se sei veramente bloccato con XNode, potrete sia necessario per lanciare a XElement o forse XContainer.

+0

Im ottenendo un'eccezione durante il tentativo di gettare a XElement. Hai una soluzione per questo? Grazie in anticipo – ot0

+0

@ ot0: non senza conoscere più contesto, no. Ti suggerisco di fare una nuova domanda con un esempio. –

+0

XElement xelm = (XElement) XNodeObject; return exception – ot0

0

È possibile utilizzare questo:

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

È possibile convertire il XNode in XElement per accedere alle sue proprietà, il mio esempio:

XNode lastNode = myXElement.LastNode; 

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

Non sta downcasting male? – batbaatar

+0

Ahhh, grazie. Ora vedo che XElement funzionerà bene, comunque. – AndrewRalon

0

Se si importa System.Xml.XPath è possibile utilizzare XPathSelectElement come questo sull'oggetto XNode:

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

Casting XNode per XElement lavora per l'individ ual elemento per recuperare il suo valore o attributi. Ma non sarai in grado di usare myXelement.Elements ("XXX") per ottenere elementi nidificati. Per questo è possibile utilizzare xmlNode.Nodes().

Questo dovrebbe funzionare:

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; 
Problemi correlati