[英]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的形式完成。 我已经更新了示例代码以显示更多内容。
我将解决您提出的两个问题:
在原始xpath查询中执行此操作将更加高效,如下所示:
//tr[@class="playerSet"]/td
这将使你拥有类playerSet的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;
}
}
使用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.