Betrachten Sie das folgende XML:
<response>
<status_code>200</status_code>
<status_txt>OK</status_txt>
<data>
<url>http://bit.ly/b47LVi</url>
<hash>b47LVi</hash>
<global_hash>9EJa3m</global_hash>
<long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
<new_hash>0</new_hash>
</data>
</response>
Ich suche nach einem wirklich kurzen Weg, um nur den Wert des <hash>
Elements zu ermitteln. Ich habe es versucht:
var hash = xml.Element("hash").Value;
Aber das funktioniert nicht. Ist es möglich, eine XPath-Abfrage an eine zu senden XElement
? Ich kann es mit dem älteren System.Xml
Framework machen und so etwas machen wie:
xml.Node("/response/data/hash").Value
Gibt es so etwas in einem LINQ-Namespace?
AKTUALISIEREN:
Nachdem ich noch ein bisschen herumgespielt hatte, fand ich einen Weg, das zu tun, was ich versuche:
var hash = xml.Descendants("hash").FirstOrDefault().Value;
Es würde mich immer noch interessieren, ob jemand eine bessere Lösung hat.
Antworten:
Um XPath mit LINQ to XML zu verwenden, fügen Sie eine using-Deklaration für hinzu
System.Xml.XPath
, um die Erweiterungsmethoden vonSystem.Xml.XPath.Extensions
in den Geltungsbereich zu bringen.In Ihrem Beispiel:
var value = (string)xml.XPathEvaluate("/response/data/hash");
quelle
System.Xml.XPath
.Andere haben vernünftigerweise vorgeschlagen, wie Sie "native" LINQ-zu-XML-Abfragen verwenden können, um das zu tun, was Sie wollen.
Um jedoch viele Alternativen bereitzustellen
XPathSelectElement
, sollten Sie XPath-Ausdrücke in Betracht ziehenXPathSelectElements
undXPathEvaluate
anhand einerXNode
(sie sind alle Erweiterungsmethoden aktiviertXNode
) bewerten . Sie können auchCreateNavigator
einXPathNavigator
für ein erstellenXNode
.Persönlich bin ich ein großer Fan der direkten Verwendung der LINQ to XML-API, da ich ein großer LINQ-Fan bin. Wenn Sie jedoch mit XPath besser vertraut sind, kann Ihnen das oben Genannte helfen.
quelle
Sehen Sie beim Umgang mit LINQ to XML, warum Sie LINQ nicht verwenden, um das eigentliche Objekt abzurufen.
Nachkommen finden jedes Element aus dem gesamten XML und listen alle Objekte auf, die dem angegebenen Namen entsprechen. In Ihrem Fall ist Hash also der Name, den es findet.
Also, anstatt es zu tun
Ich würde auseinander brechen wie:
Auf diese Weise erhalten Sie möglicherweise auch Attribute, Knotenelemente usw.
Überprüfen Sie diesen Artikel, um eine klare Vorstellung davon zu bekommen, damit es hilft. http://www.codeproject.com/KB/linq/LINQtoXML.aspx Ich hoffe, dies wird Ihnen helfen.
quelle
Mit der Methode .Element () können Sie die Elemente zu einer XPath-ähnlichen Struktur verketten.
Für Ihr Beispiel:
quelle
Ich habe versucht, ein LINQesq-Framework zum Generieren von xpath zu entwickeln. Sie können xpath mit c # Lambda-Ausdrücken beschreiben
Sie sind sich nicht sicher, ob dies in diesem Zusammenhang hilfreich ist. Eine Dokumentation finden Sie hier:
http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq
quelle