繁体   English   中英

XPath查询XPath结果并获取childNodes 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);

现在,这使我可以遍历childNodes离开初始查询。 但是,我想对此进行“改进”,而不是仅仅进行廉价的周期。

我该如何在$ e之外执行另一个xpath-> query,以便可以在foreach循环中循环遍历?

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

最后,而不是显示$ child-> textContent,我将如何获得$ child html? 我尝试过在线搜索,但找不到快速参考以了解可能的结果。 有没有一种方法可以执行回显以查看可以使用$ child->而不是textContent使用的所有可能变量? 我尝试了nodeValue,但没有得到想要的结果

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

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,就无法做到这一点

可能会有更多列,而不仅仅是“名称”,然后输出将以JSON_ENCODE的形式完成。 我已经更新了示例代码以显示更多内容。

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

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

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

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

这将使你拥有类playerSetTR父每个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()

暂无
暂无

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

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