82

次の 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>

要素の値だけを取得するための非常に短い方法を探してい<hash>ます。私は試した:

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

しかし、それはうまくいきません。に XPath クエリを提供することは可能XElementですか? 古いSystem.Xmlフレームワークで次のようなことを行うことができます。

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

LINQ 名前空間にこのようなものはありますか?


アップデート:

これをもう少しいじった後、私がやろうとしていることを行う方法を見つけました:

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

誰かがより良い解決策を持っているかどうかを知りたいですか?

4

5 に答える 5

145

LINQ to XML で XPath を使用するには、 の using 宣言を追加します。System.Xml.XPathこれにより、 の拡張メソッドがSystem.Xml.XPath.Extensionsスコープに含まれます。

あなたの例では:

var value = (string)xml.XPathEvaluate("/response/data/hash");
于 2010-09-04T15:50:22.913 に答える
39

他の人は、「ネイティブ」な LINQ to XML クエリを使用して必要なことを行う方法を完全に合理的に提案しています。

ただし、多くの代替手段を提供するために、 を検討しXPathSelectElement、に対して XPath 式を評価します (それらはすべて の拡張メソッドです)。を使用して を作成することもできます。XPathSelectElementsXPathEvaluateXNodeXNodeCreateNavigatorXPathNavigatorXNode

個人的には、LINQ の大ファンなので、LINQ to XML API を直接使用するのが大好きですが、XPath に慣れている場合は、上記の方法が役立つかもしれません。

于 2010-09-04T15:49:39.063 に答える
14

LINQ to XML を扱うとき、実際のオブジェクトを取得するために LINQ を使用しない理由を見てください。

子孫は、XML 全体から各要素を検索し、指定された名前に一致するすべてのオブジェクトを一覧表示します。したがって、あなたの場合、ハッシュはそれが見つけた名前です。

だから、やるよりも

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

私は次のようにバラバラになります:

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

if(hash != null)
 hash.Value // as hash can be null when default. 

このようにして、属性、ノード要素なども取得できます。

この記事をチェックして、それについて明確なアイデアを得ることができます。 http://www.codeproject.com/KB/linq/LINQtoXML.aspx これがお役に立てば幸いです。

于 2010-09-04T15:32:57.613 に答える
9

.Element() メソッドを使用して要素を連鎖させ、XPath のような構造を形成できます。

あなたの例:

XElement xml = XElement.Parse(@"...your xml...");
XElement hash = xml.Element("data").Element("hash");
于 2013-10-23T20:01:44.973 に答える
2

xpath を生成するための LINQesq フレームワークを考え出そうとしました。C# ラムダ式を使用して xpath を記述することができます

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

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

これがこのコンテキストで役立つかどうかはわかりませんが、ドキュメントは次の場所にあります。

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

于 2014-02-02T01:21:27.213 に答える