Come usare XPath con XElement o LINQ?

Considera il seguente XML:

 200 OK  http://bit.ly/b47LVi b47LVi 9EJa3m http://www.tumblr.com/docs/en/api#api_write 0   

Sto cercando un modo davvero breve per ottenere il valore dell’elemento . Provai:

 var hash = xml.Element("hash").Value; 

Ma non funziona. È ansible fornire una query XPath a un XElement ? Posso farlo con il vecchio framework System.Xml , facendo qualcosa del tipo:

 xml.Node("/response/data/hash").Value 

C’è qualcosa di simile in uno spazio dei nomi LINQ?


AGGIORNARE:

Dopo aver iniziato a curiosare di più, ho trovato un modo per fare ciò che sto cercando di fare:

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

Sarei ancora interessato a vedere se qualcuno ha una soluzione migliore?

Per utilizzare XPath con LINQ su XML aggiungere una dichiarazione using per System.Xml.XPath , questo porterà i metodi di estensione di System.Xml.XPath.Extensions in ambito.

Nel tuo esempio:

 var value = (string)xml.XPathEvaluate("/response/data/hash"); 

Altri hanno suggerito in modo ragionevole come usare LINQ “nativo” alle query XML per fare ciò che vuoi.

Tuttavia, allo scopo di fornire molte alternative, prendere in considerazione XPathSelectElement , XPathSelectElements e XPathEvaluate per valutare le espressioni XPath rispetto a un XNode (sono tutti metodi di estensione su XNode ). È inoltre ansible utilizzare CreateNavigator per creare un XPathNavigator per un XNode .

Personalmente sono un grande fan dell’uso diretto dell’API LINQ to XML, visto che sono un grande fan di LINQ, ma se ti senti più a tuo agio con XPath, quanto sopra potrebbe aiutarti.

Vedi, quando si ha a che fare con LINQ in XML perché non si usa LINQ per ottenere l’object reale.

I discendenti trovano ogni elemento dall’intero XML e elenca tutti gli oggetti che corrispondono al nome specificato. Quindi nel tuo caso l’hash è il nome che trova.

Quindi, piuttosto che farlo

 var hash = xml.Descendants("hash").FirstOrDefault().Value; 

Mi spezzerei come:

 var elements = xml.Descendants("hash"); var hash = elements.FirstOrDefault(); if(hash != null) hash.Value // as hash can be null when default. 

In questo modo potresti anche ottenere attributi, elementi di nodes, ecc.

Controlla questo articolo per farti un’idea chiara in modo che sia d’aiuto. http://www.codeproject.com/KB/linq/LINQtoXML.aspx Spero che questo ti possa aiutare.

È ansible utilizzare il metodo .Element () per concatenare gli elementi per formare una struttura simile a XPath.

Per il tuo esempio:

 XElement xml = XElement.Parse(@"...your xml..."); XElement hash = xml.Element("data").Element("hash"); 

Ho cercato di creare un framework LINQesq per generare xpath. Ti permette di descrivere xpath usando le espressioni c # lambda

 var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr"); var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text); 

Non sono sicuro se questo è utile in questo contesto, ma puoi trovare la documentazione qui:

http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq