最も近い先行する兄弟を見つけるためのXPathステートメント

c# html-agility-pack xpath

質問

私はHTMLAgilityPackをC#WPFアプリケーションで使用して、ローカルHTMLページのいくつかのアンカータグをループし、href属性を抽出します。これはうまくいきますが、アンカーがHTML文書(アンカータグでもあります)内のタイトルを見つける必要があります。これはXPathで行うには簡単にできるはずですが、すべてのシナリオで動作するステートメントを取得できないようです。

ここで私のHTMLのサンプルです(これは私が制御できません):

<html>
    <body>
        <table>
            <tr>
                <td><div><a href="#maintitle" class="title">maintitle</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link1.pdf">link1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link2.pdf">link2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link3.pdf">link3</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link4.pdf">link4</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link5.pdf">link5</a></div></td>
            </tr>
        </table>
    </body>
</html>

link1を見つけたら、私はsubtitle1を探したいと思う。 link2とlink3も同様です。しかし、link4とlink5については、私はsubtitle2を探しています。私はこのXPathステートメントを使用しています(最初のセクションは、オンラインのXPathエバリュエーターhttps://www.freeformatter.com/xpath-tester.htmlで使用していたアンカータグの選択をシミュレートするためのものです) :

<html>
    <body>
        <table>
            <tr>
                <td><div><a href="#maintitle" class="title">maintitle</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link1.pdf">link1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link2.pdf">link2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link3.pdf">link3</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link4.pdf">link4</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link5.pdf">link5</a></div></td>
            </tr>
        </table>
    </body>
</html>

これはlink1へのlink1で機能しますが、link4とlink5ではsubtitle1とsubtitle2の両方を返します。 preceding preceding-sibling::t [1]を追加すると、link4のために修正されますが、link2、link3、link5のために修正されます:

<html>
    <body>
        <table>
            <tr>
                <td><div><a href="#maintitle" class="title">maintitle</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link1.pdf">link1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link2.pdf">link2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link3.pdf">link3</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link4.pdf">link4</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link5.pdf">link5</a></div></td>
            </tr>
        </table>
    </body>
</html>

私も、 preceding-sibling::tlast()を追加しようとしましたが、結果としてリンクのどれも見つかりませんでした。

<html>
    <body>
        <table>
            <tr>
                <td><div><a href="#maintitle" class="title">maintitle</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link1.pdf">link1</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link2.pdf">link2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link3.pdf">link3</a></div></td>
            </tr>
            <tr>
                <td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link4.pdf">link4</a></div></td>
            </tr>
            <tr>
                <td><div><a href="link5.pdf">link5</a></div></td>
            </tr>
        </table>
    </body>
</html>

私は単純な解決策があると確信していますが、私は決してXPathの能力がないので、苦労しています。最も近い兄弟を返すために元のXPathステートメントを取得するにはどうすればよいですか?

受け入れられた回答

リンクテキストで字幕を取得するロケータ( 'link4')

(//a[text()='link5']/preceding::tr[.//a[@class='subtitle']])[last()]

論理:

//a[text()='link4'] - リンクテキストで要素を取得する

//a[text()='link4']/preceding::tr - 全ての親を検索する

[.//a[@class='subtitle']] - クラス' subtitle 'を持つタグaを含む最初の親を取得する

(someLocator)[last()] - ここではロケータに一致する最後の要素を取得する - クラス ' subtitle 'を持つタグaを含む最後の親を取得する

別のオプション - 最初に要素の代わりにtrを検索a

(//tr[.//a[text()='link5']]/preceding-sibling::tr//a[contains(@class,'subtitle')])[last()]

うまくいけば、それは誰でもロジックロゴ構築ロケータを取得するのに役立ちます


人気のある回答

xpathを使ってみてください:

//a[@href='<your_input>']/preceding-sibling::tr[.//a[@class='subtitle']][1]

<your_input>link1.pdfからlink5.pdf




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