C#でHtmlAgilityPackを使用して子を含む要素のすべてのテキストノードを取得する

.net .net-2.0 c# html-agility-pack xpath

質問

子要素を含む要素のすべてのテキストノードを取得しようとしていますが、なんらかの理由でHTML文書全体が表示されています。

これは私が思いついたものです:

HtmlAgilityPack.HtmlNode el = htmlDoc.DocumentNode.SelectSingleNode("(//div[@class='TableContainer'])[" + index + "]");
if (el != null)
{
    foreach (HtmlNode node in el.SelectNodes("//text()"))
    {
        Debug.WriteLine("text=" + node.InnerText.Replace(" ", " "));
    }
}

それは、文書全体のtext=lineを出力します。 //text()に何か問題があると確信してい//text() 、これは私がここで見つけたスニペットですが、別のやり方を知らず、狂ってしまいました。

受け入れられた回答

相対的なXPath式を使用する必要があります。これは、 elコンテキストノードに対して相対的です

HtmlAgilityPack.HtmlNode el = htmlDoc.DocumentNode.SelectSingleNode("(//div[@class='TableContainer'])[" + index + "]");
if (el != null)
{
    foreach (HtmlNode node in el.SelectNodes(".//text()"))
    {
        Debug.WriteLine("text=" + node.InnerText.Replace(" ", " "));
    }
}

"//text()"は、ドキュメントルートノードのすべての子孫テキストノードを選択します

詳細については、XPath仕様のロケーションパス短縮構文を参照してください。

  • //paraはドキュメントルートのすべてのpara子孫を選択し、コンテキストノードと同じドキュメント内のすべてのpara要素を選択します

  • .//paraは、コンテキストノードのpara要素子孫を選択します。



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