繁体   English   中英

在单个xpath中选择多个节点

[英]select multiple nodes in single xpath

我如何从该html元素中选择所有<tr> ,然后

  1. 从第一个td中选择/ small / a
  2. 从第二个td中选择/ small / i
  3. 从第三个TD中选择/小
  4. 从第四个TD中选择/小
  5. 从第六个td选择/ form

我想使用从PHP中从这里获得的信息作为数组或对象

提前致谢

 <tbody><tr> <td colspan="6" class="title">Applications</td> </tr> <tr> <td class="header-left"><small>Path</small></td> <td class="header-left"><small>Version</small></td> <td class="header-center"><small>Display Name</small></td> <td class="header-center"><small>Running</small></td> <td class="header-left"><small>Sessions</small></td> <td class="header-left"><small>Commands</small></td> </tr> <tr> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"><small><a href="/">/</a></small></td> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"><small><i>None specified</i></small></td> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"><small>Welcome to Tomcat</small></td> <td class="row-center" rowspan="2" bgcolor="#FFFFFF"><small>true</small></td> <td class="row-center" rowspan="2" bgcolor="#FFFFFF"><small><a href="/manager/html/sessions?path=/&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA">0</a></small></td> <td class="row-left" bgcolor="#FFFFFF"> &nbsp;<small>Start</small>&nbsp; <form class="inline" method="POST" action="/manager/html/stop?path=/&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA"> <small><input value="Stop" type="submit"></small> </form> <form class="inline" method="POST" action="/manager/html/reload?path=/&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA"> <small><input value="Reload" type="submit"></small> </form> <form class="inline" method="POST" action="/manager/html/undeploy?path=/&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA"> <small><input value="Undeploy" type="submit"></small> </form> </td> </tr><tr> <td class="row-left" bgcolor="#FFFFFF"> <form method="POST" action="/manager/html/expire?path=/&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA"> <small> &nbsp;<input value="Expire sessions" type="submit">&nbsp;with idle ≥&nbsp;<input name="idle" size="5" value="30" type="text">&nbsp;minutes&nbsp; </small> </form> </td> </tr> <tr> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"><small><a href="/item1/">/item1</a></small></td> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"><small><i>None specified</i></small></td> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"><small>&nbsp;</small></td> <td class="row-center" rowspan="2" bgcolor="#C3F3C3"><small>false</small></td> <td class="row-center" rowspan="2" bgcolor="#C3F3C3"><small><a href="/manager/html/sessions">0</a></small></td> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"> <form class="inline" method="POST" action="item1Start"> <small> <input value="Start" type="submit"> </small> </form> &nbsp;<small>Stop</small>&nbsp; &nbsp;<small>Reload</small>&nbsp; <form class="inline" method="POST" action="item1Undeploy"> <small> <input value="Undeploy" type="submit"> </small> </form> </td> </tr> <tr></tr> <tr> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"><small><a href="/item2/">/item2</a></small></td> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"><small><i>None specified</i></small></td> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"><small>&nbsp;</small></td> <td class="row-center" rowspan="2" bgcolor="#FFFFFF"><small>false</small></td> <td class="row-center" rowspan="2" bgcolor="#FFFFFF"><small><a href="/manager/html/sessions">0</a></small></td> <td class="row-left" rowspan="2" bgcolor="#FFFFFF"> <form class="inline" method="POST" action="/manager/html/sessions?path=/manager"> <small><input value="Start" type="submit"></small> </form> &nbsp;<small>Stop</small>&nbsp; &nbsp;<small>Reload</small>&nbsp; <form class="inline" method="POST" action="/manager/html/sessions?path=/manager"> <small> <input value="Undeploy" type="submit"> </small> </form> </td> </tr> <tr></tr> <tr> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"><small><a href="/manager/">/manager</a></small></td> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"><small><i>None specified</i></small></td> <td class="row-left" rowspan="2" bgcolor="#C3F3C3"><small>Tomcat Manager Application</small></td> <td class="row-center" rowspan="2" bgcolor="#C3F3C3"><small>true</small></td> <td class="row-center" rowspan="2" bgcolor="#C3F3C3"><small><a href="/manager/html/sessions?path=/manager&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA">33</a></small></td> <td class="row-left" bgcolor="#C3F3C3"> <small> &nbsp;Start&nbsp; &nbsp;Stop&nbsp; &nbsp;Reload&nbsp; &nbsp;Undeploy&nbsp; </small> </td> </tr><tr> <td class="row-left" bgcolor="#C3F3C3"> <form method="POST" action="/manager/html/expire?path=/manager&amp;org.apache.catalina.filters.CSRF_NONCE=7DF475B8EF3807C4BCA8651FEBA676EA"> <small> &nbsp;<input value="Expire sessions" type="submit">&nbsp;with idle ≥&nbsp;<input name="idle" size="5" value="30" type="text">&nbsp;minutes&nbsp; </small> </form> </td> </tr> </tbody> 

我如何从这个html元素中选择所有s,然后

我不知道s是什么,但我假设您是指1-5要求中的元素? 由于您使用PHP,因此我假设使用XPath 1.0。

XPath 1.0

您没有说出来,但我实际上认为您想选择所有tr (前两个除外),并从每个tr选择x th <td>并从每个列中选择特定值。

因此,让我们从tbody/tr[position() > 2] ,然后:

从第一个td中选择/ small / a

添加/td[1]/small/a

 select /small/i from the second td 

添加/td[2]/small/i

从第三个TD中选择/小

添加/td[3]/small

从第四个TD中选择/小

添加/td[4]/small

从第六个td选择/ form

添加/td[6]/form

得到图案? 本质上,XPath非常简单。 现在,我们需要做的就是将它们结合起来。 正如评论中已经说过的,只需使用union运算符| 这将给我们:

tbody/tr[position() > 2]/td[1]/small/a
| tbody/tr[position() > 2]/td[2]/small/i
| tbody/tr[position() > 2]/td[3]/small
| tbody/tr[position() > 2]/td[4]/small
| tbody/tr[position() > 2]/td[6]/form

而已!

现在,如果您要使用XSLT(假设您想对此集合做某事),则可以通过在tr上应用模板,然后简单地为每个需求创建模板来简化这一工作。 无需复杂的嵌套if语句。

XPath 2.0

为了完整起见,这是XPath 2.0版本(可读性更高):

for $tr in tbody/tr[position() > 2]
return 
    $tr/td[1]/small/a,
    $tr/td[2]/small/i,
    $tr/(td[3] | td[4])/small,
    $tr/td[6]/form

或者,如果HTML的结构不包含错误,则可以编写更简单的代码(也包括XPath 2.0):

tbody/tr[position() > 2]/td[not(position() = 5)]
/(small/(i | a) | small[not(i|a)] | form)

不幸的是,PHP尚不支持XPath 2.0,尽管您可以使用第三方XPath 2.0处理器并从PHP调用其接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM