Html Agility Pack - 問題のサブノードの選択

asp.net-mvc c# html-agility-pack

質問

私はAsicsの実行計画をiCalにエクスポートしたいのですが、Asicsはこのサービスを提供していないので、私は自分の個人的な使用のために少しスクレーパーを構築することに決めました。私がしたいのは、私の計画から予定されているすべての実行を取り、それに基づいてiCalフィードを生成することです。私はC#とHtml Agility Packを使用しています。

私がしたいことは、スケジュールされたすべての実行(divノードです)を繰り返すことです。次に、私は自分の実行ノードでいくつかの異なるノードを選択したいと思います。私のコードは次のようになります:

foreach (var run in doc.DocumentNode.SelectSingleNode("//div[@id='scheduleTable']").SelectNodes("//div[@class='pTdBox']"))
{
    number++;
    string date = run.SelectSingleNode("//div[@class='date']").InnerText;
    string type = run.SelectSingleNode("//span[@class='menu']").InnerHtml;
    string distance = run.SelectSingleNode("//span[@class='distance']").InnerHtml;
    string description = run.SelectSingleNode("//div[@class='description']").InnerHtml;
    ViewData["result"] += "Dato: " + date + "<br />";
    ViewData["result"] += "Tyep: " + type + "<br />";
    ViewData["result"] += "Distance: " + distance + "<br />";
    ViewData["result"] += "Description: " + description + "<br />";
    ViewData["result"] += run.InnerHtml.Replace("<", "&lt;").Replace(">", "&gt;") + "<br />" + "<br />" + "<br />";
}

私の問題はrun.SelectSingleNode("//div[@class='date']").InnerTextは指定された実行ノード内の指定されたXPathを持つノードを選択しません。これは、ドキュメント全体のXPathと一致する最初のノードを選択します。

現在のノード内の指定されたXPathで単一ノードを選択するにはどうすればよいですか?

ありがとうございました。

更新

私はこのXPath文字列を更新しようとしました:

string date = run.SelectSingleNode(".div[@class='date']").InnerText;

これは、現在のノード内の<div class="date"></div>要素を選択する必要があります。さて、私はこれを試みたが、このエラーが発生しました:

式はノード集合に評価されなければならない。説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

例外の詳細:System.Xml.XPath.XPathException:式はノードセットに評価する必要があります。

助言がありますか?

受け入れられた回答

HtmlAgilityPackXPath式で作業するときに役立ついくつかのことがあります。

runHtmlNode場合は、 HtmlNodeになります。

  1. run.SelectNodes("//div[@class='date']")
    Willはdoc.DocumentNode.SelectNodes("//div[@class='date']")まったく同じように動作します

  2. run.SelectNodes("./div[@class='date']")
    runノードの子であるすべての<div>ノードを提供します。次の深度レベルでのみ、深く検索することはありません。

  3. run.SelectNodes(".//div[@class='date']")
    そのクラス属性を持つすべての<div>ノードを返しますが、 runノードの横だけでなく、深さも検索します(可能なすべての子孫)

どちらがあなたのニーズを満たすかに応じて、2.または3.のいずれかを選択する必要があります:)


人気のある回答

XPATHでは、 //は現在のノードの下にあるすべての子ノードと子ノードを意味します。したがって、より制限の厳しいXPATH式を考え出す必要があります。あなたが本当のHTMLを提供し、正確に何を探しているのか、私たちはあなたがさらに掘り下げるのを助けることができます。

あなたが持っているエラーについて:

.div[@class='date']は無効です. div固執する。 div[@class='date'] 、または./div[@class='date']を使うことができます。これは同等であると信じています。これは理由があり. XPATH axであり、これはself別名であり、 "現在のノード"を意味します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ