Php 在单个xpath中选择多个节点

Php 在单个xpath中选择多个节点,php,html,xpath,Php,Html,Xpath,如何从这个html元素中选择所有的,然后 从第一个td中选择/small/a 从第二个td中选择/small/i 从第三个td中选择/small 从第四个td中选择/small 从第六个td中选择/形成 我想使用php中从这里获得的信息作为数组或对象 提前谢谢 应用 路径 版本 显示名称 跑步 会议 命令 未指定 欢迎来到Tomcat 真的 开始 闲着≥ 会议记录 未指定 假的 停止 重新加载 未指定 假的 停止 重新加载 未指定 Tomcat管理器应用程序 真的 开始 停止 重新加载 解

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

  • 从第一个td中选择/small/a
  • 从第二个td中选择/small/i
  • 从第三个td中选择/small
  • 从第四个td中选择/small
  • 从第六个td中选择/形成
  • 我想使用php中从这里获得的信息作为数组或对象

    提前谢谢

    
    应用
    路径
    版本
    显示名称
    跑步
    会议
    命令
    未指定
    欢迎来到Tomcat
    真的
    开始
    闲着≥  会议记录
    未指定
    假的
    停止
    重新加载
    未指定
    假的
    停止
    重新加载
    未指定
    Tomcat管理器应用程序
    真的
    开始
    停止
    重新加载
    解除部署
    闲着≥  会议记录
    
    如何从这个html元素中选择所有的,然后

    我不知道
    s
    是什么,但我想你指的是1-5个需求的元素?由于您使用PHP,因此我将假定XPath 1.0

    XPath 1.0 您没有说,但我实际上认为您希望选择所有
    tr
    (前两个除外),并从每个
    tr
    中选择第x个
    ,从每个列中选择某个值

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

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

    添加
    /td[1]/small/a

    添加
    /td[2]/small/i

    从第三个td中选择/small

    添加
    /td[3]/small

    从第四个td中选择/small

    添加
    /td[4]/small

    从第六个td中选择/形成

    添加
    /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语句

    XPath2.0 为了完整起见,这里是XPath 2.0版本(可读性稍高):

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

    不幸的是,PHP还不支持XPath2.0,尽管您可以使用第三方XPath2.0处理器并从PHP调用其接口

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

    我不知道
    s
    是什么,但我想你指的是1-5个需求的元素?由于您使用PHP,因此我将假定XPath 1.0

    XPath 1.0 您没有说,但我实际上认为您希望选择所有
    tr
    (前两个除外),并从每个
    tr
    中选择第x个
    ,从每个列中选择某个值

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

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

    添加
    /td[1]/small/a

    添加
    /td[2]/small/i

    从第三个td中选择/small

    添加
    /td[3]/small

    从第四个td中选择/small

    添加
    /td[4]/small

    从第六个td中选择/形成

    添加
    /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语句

    XPath2.0 为了完整起见,这里是XPath 2.0版本(可读性稍高):

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


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

    /td[1]/small/a |/td[2]/small/i
    因此,如果不在td上使用起始斜杠,它将用于所有TDs并创建一个内容数组,因此“td/small”将为您提供数组中元素内部的所有元素的内容。
    /td[1]/small/a |/td[2]/small/i
    因此,如果不使用td上的起始斜杠,它将用于所有TDs并创建一个内容数组,因此“td/small”将为您提供数组中元素内部的所有元素的内容。
    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
    
    tbody/tr[position() > 2]/td[not(position() = 5)]
    /(small/(i | a) | small[not(i|a)] | form)