XPath 查询 XPath 结果并获取子节点 HTML


XPath query off a XPath result and get childNodes HTML

我试图弄清楚如何从jquery结果中获取HTML,同时能够在PHP中对结果进行jquery。

这是我一直在使用的当前代码

 $url = 'http://www.foobar.com';
$output = file_get_contents($url);
$doc = new DOMDocument();
libxml_use_internal_errors(true); //Supress Warnings for HTML5 conversion issue
$doc->loadHTML($output);
libxml_use_internal_errors(false); //Start Showing Errors
$xpath = new DOMXpath($doc);

$CategoryString = '//tr[@class="playerSet"]';

$obj = new stdClass();
$x = 0;
foreach ($xpath->query($CategoryString) as $e) {
    $x++;
    $y = 0;
    foreach ($e->childNodes as $child) 
    { 
       $y++;
       if ($y == 1) $obj->players[$x]['name'] = $child->textContent;
       if ($y == 3) $obj->players[$x]['position'] = $child->textContent;
       if ($y == 5) $obj->players[$x]['team'] = $child->textContent;
       if ($y == 7) $obj->players[$x]['opp'] = $child->textContent;
    }
}

echo json_encode($obj);

现在,这允许我从初始查询中循环遍历子节点。 然而,我想让它更"精致",而不仅仅是做一个廉价的循环。

我将如何在$e中执行另一个 xpath-> 查询,以便我可以在 foreach 循环中循环访问这些查询?

例如,我想对 ('//td'( 进行查询,这样我就可以对初始查询结果 ($e( 的//td 的结果执行 foreach

最后,我将如何获得$child html,而不是显示$child>文本内容? 我尝试过在线搜索,但我找不到我可以使用什么来查看可能结果的快速参考。 有没有办法做一个回显来查看我可以在 $child-> 而不是 textContent 上使用的所有可能的变量? 我尝试了节点值,但我没有得到我正在寻找的结果

编辑 - 找到了一种通过函数获取 DOM 的内部 HTML 的方法,以防有人好奇

function DOMinnerHTML(DOMNode $element) 
{ 
    $innerHTML = ""; 
    $children  = $element->childNodes;
    foreach ($children as $child) 
    { 
        $innerHTML .= $element->ownerDocument->saveHTML($child);
    }
    return $innerHTML; 
}

仍在寻求有关使用示例 jquery 在$e中执行 foreach 的任何帮助。

编辑 - 为了整理,我需要对$e进行查询

的原因

一个主要原因是因为在"名称"列中有时它是重复的,所以我只想通过做来获取名称......

'//td/span'

关闭主查询。 如果不对主查询的结果执行另一个 jquery 操作,我就无法做到这一点

可能有更多的列,然后只是"name",然后输出将作为JSON_ENCODE完成。 我已经更新了我的示例代码以显示更多内容。

我将解决您提出的两个问题:

1. 如何在$e外执行另一个 xpath->查询?

在原始 xpath 查询中执行此操作会更有效,如下所示:

//tr[@class="playerSet"]/td

这将为您提供具有类玩家集tr 父级的每个 td 的结果。

但是,如果需要,您确实可以使用某个节点作为范围进行另一个查询。DOMXPath 查询方法允许您将该节点作为第二个参数传递:

foreach ($xpath->query('//tr') as $e) {
    foreach ($xpath->query('td', $e) as $child) {
        echo $child->textContent;
    } 
} 

但在这种情况下,使用 XPath 查询来获取 TR 元素的TD子元素有点矫枉过正。使用 childNodes 属性也可以正常工作(因为表行除了 TD 元素之外不应该有任何其他子项(,并且效率更高:

foreach ($xpath->query('//tr') as $e) {
    foreach ($e->childNodes as $child) {
        echo $child->textContent;
    } 
} 

2. 如何获取$child html?

使用 saveHTML 方法:

$obj->players[$x]['innerHTML'] = $doc->saveHTML($e);

您可能还感兴趣的是:

XPath 位置路径上的文档:

child::*选择上下文节点的所有元素子元素

child::text()选择上下文节点的所有文本节点子级

child::node()选择上下文节点的所有子节点,无论其节点类型如何

例如,你可以玩这个:

//tr[@class="playerSet"]/child::node()

或者,如果您想遍历整个标签树(不仅是下一级别(:

//tr[@class="playerSet"]/descendant::node()