代码之家  ›  专栏  ›  技术社区  ›  craig

xpath:前一个和后一个兄弟

  •  2
  • craig  · 技术社区  · 6 年前

    XML:

    <body>
        <h2><font style="font-weight: bold">Baz</font></h2>
        <p><img title="image" /></p>
        <p>Baz 0 with an <a href="http://">anchor</a> element.</p>
        <p>Baz 1 with an <a href="http://">anchor</a> element.</p>
        <hr />
        <h2><font style="font-weight: bold">People</font></h2>
        <ul>
            <li>People 0 with <a href="http://" >an anchor</a> element.</li>
            <li>People 1 with an <a href="http://" >an anchor</a> element.</li>
        </ul>
        <hr/>
        <h2><font style="font-weight: bold">Sales</font></h2>
        <ul>
            <li>List item 2 with an <a href="http://" >an anchor</a> element.</li>
            <li>List item 3 with an <a href="http://" >an anchor</a> element.</li>
            <li>List item 4 without an anchor element.</li>
        </ul>
        <hr />
        <h2><font style="font-weight: bold">Sales</font></h2>
        <p><img title="image" /></p>
        <p>sales 0 with an <a href="http://">anchor</a> element.</p>
        <p>sales 1 with an <a href="http://">anchor</a> element.</p>
        <hr />
        <h2><font style="font-weight: bold">Foo</font></h2>
        <ul>
            <li>Foo 0 with <a href="http://" >an anchor</a> element.</li>
            <li>Foo 1 with an <a href="http://" >an anchor</a> element.</li>
        </ul>
        <hr />
        <h2><font style="font-weight: bold">Bar</font></h2>
        <p><img title="image" /></p>
        <p>bar 0 with an <a href="http://">anchor</a> element.</p>
        <p>bar 1 with an <a href="http://">anchor</a> element.</p>
        <hr />
    </body>
    

    此xpath: //p[a and preceding-sibling::h2[font[text()='Sales']][1] and following-sibling::hr[1]]

    返回:

    <p>sales 0 with an <a href="http://">anchor</a> element.</p>
    <p>sales 1 with an <a href="http://">anchor</a> element.</p>
    <p>bar 0 with an <a href="http://">anchor</a> element.</p>
    <p>bar 1 with an <a href="http://">anchor</a> element.</p>
    

    渴望的 p :

    <p>sales 0 with an <a href="http://">anchor</a> element.</p>
    <p>sales 1 with an <a href="http://">anchor</a> element.</p>
    

    渴望的 li :

    <li>List item 2 with an <a href="http://" >an anchor</a> element.</li>
    <li>List item 3 with an <a href="http://" >an anchor</a> element.</li>
    

    我错过了什么?

    如何更改xpath以包括 li/[a] 以同样的方式包括 p/[a] ?这个 preceding/following-sibling 不会和 .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Haley    6 年前

    您只需要指定它是前面的第一个兄弟h2:

    preceding-sibling::h2[1]
    

    更新了xpath(我还简化了 Sales ):

    //p[a and preceding-sibling::h2[1][.='Sales'] and following-sibling::hr]
    

    另外,如果您需要确定以下第一个兄弟姐妹 p hr ,你可以试试这个……

    //p[a and preceding-sibling::h2[1][.='Sales'] and following-sibling::*[not(self::p)][1][self::hr]]
    

    如果你想同时选择 li 除了 能够 更新要使用的xpath preceding:: following:: ,但您必须考虑可能显示为 喜欢 a , span 等等……

    //*[self::p or self::li][a and preceding::h2[1][.='Sales'] and following::*[not(self::p) and not(self::li) and not(self::a)][1][self::hr]]
    

    这将从示例xml中选择以下内容…

    <li>List item 2 with an <a href="http://" >an anchor</a> element.</li>
    <li>List item 3 with an <a href="http://" >an anchor</a> element.</li>
    <p>sales 0 with an <a href="http://">anchor</a> element.</p>
    <p>sales 1 with an <a href="http://">anchor</a> element.</p>
    

    但是,我建议使用第二个xpath 明确地。。。

    //li[a and preceding::h2[1][.='Sales'] and ../following-sibling::*[1][self::hr]]