我在理解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但无法获得任何工作。任何帮助将不胜感激!
答案 0 :(得分:11)
是的,您可以运行另一个xpath查询,类似于:
foreach ($nodelist as $n)
{
$other_nodes = $xpath->query('div[@class="somethingelse"]', $n);
echo $other_nodes->length;
}
这将使用somethingelse类获取内部div,$ xpath-&gt;查询方法的第二个参数告诉查询将此节点作为上下文,请参阅更多http://fr2.php.net/manual/en/domxpath.query.php
答案 1 :(得分:3)
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;
}
答案 2 :(得分:2)
如果我正确理解你的问题,那么当我使用descendant :: expression时它就有用了。试试这个:
foreach ($nodelist as $n) {
$other_nodes = $xpath->query('descendant::div[@class="some-descendant"]', $n);
echo $other_nodes->length;
echo $other_nodes->item(0)->nodeValue;
}
虽然有时仅使用//路径表达式组合查询来缩小搜索范围。 // path表达式从当前节点开始选择与选择器匹配的节点。
$nodes = $xpath->query('//div[@class="some-descendant"]//div[@class="some-descendant-of-that-descendant"]');
然后循环浏览那些你需要的东西。希望这会有所帮助。
答案 3 :(得分:0)
这是一个代码片段,允许您使用类属性&#34;访问每个节点中包含的信息&#34;:
$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);`