11

我在理解 childNodes 中究竟存储了什么时遇到了一些麻烦。理想情况下,我想对每个子节点执行另一个 xquery,但似乎无法弄清楚。这是我的场景: 数据:

<div class="something">
    <h3>
        <a href="link1.html">Link text 1</a>
    </h3>
    <div class"somethingelse">Something else text 1</div>
</div>
<div class="something">
    <h3>
        <a href="link2.html">Link text 2</a>
    </h3>
    <div class"somethingelse">Something else text 2</div>
</div>
<div class="something">
    <h3>
        <a href="link3.html">Link text 3</a>
    </h3>
    <div class"somethingelse">Something else text 3</div>
</div>

和代码:

$html = new DOMDocument();
$html->loadHtmlFile($local_file);
$xpath = new DOMXPath( $html );
$nodelist = $xpath->query( "//div[@class='something']");
foreach ($nodelist as $n) {
    Can I run another query here? }

对于“某事”的每个元素(即 $n),我想访问两段文本和 href 的值。我尝试使用 childNode 和另一个 xquery,但无法正常工作。任何帮助将不胜感激!

4

4 回答 4

13

是的,您可以运行另一个 xpath 查询,例如:

foreach ($nodelist as $n)
{
    $other_nodes = $xpath->query('div[@class="somethingelse"]', $n);

    echo $other_nodes->length;
}

这将为您提供带有其他类的内部 div,$xpath->query 方法的第二个参数告诉查询将此节点作为上下文,请参阅更多http://fr2.php.net/manual/en/domxpath .query.php

于 2011-10-25T23:25:07.337 回答
5

如果我正确理解了您的问题,那么当我使用 descendant:: 表达式时它就起作用了。尝试这个:

foreach ($nodelist as $n) {
    $other_nodes = $xpath->query('descendant::div[@class="some-descendant"]', $n);

    echo $other_nodes->length;
    echo $other_nodes->item(0)->nodeValue;
}

尽管有时使用 // 路径表达式组合查询就足以缩小搜索范围。// 路径表达式从与选择器匹配的当前节点开始选择文档中的节点。

$nodes = $xpath->query('//div[@class="some-descendant"]//div[@class="some-descendant-of-that-descendant"]');

然后遍历那些你需要的东西。希望这可以帮助。

于 2014-08-10T06:35:13.497 回答
4

Trexx 有,但他错过了问题的最后一句话:

foreach ($nodelist as $n){
    $href = $xpath->query('h3/a', $n)->item(0)->getAttribute('href');
    $a_text = $xpath->query('h3/a', $n)->item(0)->nodeValue;
    $div_text = $xpath->query('div', $n)->item(0)->nodeValue;
}
于 2011-10-26T02:07:28.147 回答
0

下面是一个代码片段,它允许您使用类属性“something”访问每个节点中包含的信息:

$nodes_tracker = 0;
$nodes_array = array();
foreach($nodelist as $n){
    $info = $xpath->query('//h3//a', $n)->item($nodes_tracker)->nodeValue;
    $extra_info = $xpath->query('//div[@class="somethingelse"', $n)->item($nodes_tracker)->nodeValue;
    array_push($nodes_array, $info. ' - '. $extra_info . '<br>'); //Add each info to array  
    $nodes_tracker++;
}
print_r($nodes_array);`
于 2016-03-01T15:31:32.073 回答