我有这样的布局:
<div class="fly">
<img src="a.png" class="badge">
<img class="aye" data-original="b.png" width="130" height="253" />
<div class="to">
<h4>Fly To The Moon</h4>
<div class="clearfix">
<div class="the">
<h4>**Wow**</h4>
</div>
<div class="moon">
<h4>**Great**</h4>
</div>
</div>
</div>
</div>
首先我从xpath:得到查询
$a = $xpath->query("//div[@class='fly']""); //to get all elements in class fly
foreach ($a as $p) {
$t = $p->getElementsByTagName('img');
echo ($t->item(0)->getAttributes('data-original'));
}
当我运行代码时,它将产生0个结果。在我追踪之后,我发现<img class="badge">
首先被处理。我想问,如何从<img class="aye">
获得数据原始值,同时从<h4>
标签获得值"Wow"one_answers"很棒?
谢谢你,
提醒您,您可以使用另一个xpath查询来添加到当前代码中。
要获取属性,请使用->getAttribute()
:
$dom = new DOMDocument();
$dom->loadHTML($markup);
$xpath = new DOMXpath($dom);
$parent_div = $xpath->query("//div[@class='fly']"); //to get all elements in class fly
foreach($parent_div as $div) {
$aye = $xpath->query('./img[@class="aye"]', $div)->item(0)->getAttribute('data-original');
echo $aye . '<br/>'; // get the data-original
$others = $xpath->query('./div[@class="to"]/div[@class="clearfix"]', $div)->item(0);
foreach($xpath->query('./div/h4', $others) as $node) {
echo $node->nodeValue . '<br/>'; // echo the two h4 values
}
echo '<hr/>';
}
样本输出
感谢您的代码!
我尝试了代码,但失败了,我不知道为什么。所以,我修改了你的一些代码,它就工作了!
$dom = new DOMDocument();
$dom->loadHTML($markup);
$xpath = new DOMXpath($dom);
$parent_div = $xpath->query("//div[@class='fly']"); //to get all elements in class fly
foreach($parent_div as $div) {
$aye = $xpath->query('**descendant::**img[@class="aye"]', $div)->item(0)->getAttribute('data-original');
echo $aye . '<br/>'; // get the data-original
$others = $xpath->query('**descendant::**div[@class="to"]/div[@class="clearfix"]', $div)->item(0);
foreach($xpath->query('.//div/h4', $others) as $node) {
echo $node->nodeValue . '<br/>'; // echo the two h4 values
}
echo '<hr/>';
}
我不知道./
和descendant
之间有什么区别,但我的代码使用descendant
可以很好地工作。
给定以下XML:
<div class="fly">
<img src="a.png" class="badge">
<img class="aye" data-original="b.png" width="130" height="253" />
<div class="to">
<h4>Fly To The Moon</h4>
<div class="clearfix">
<div class="the">
<h4>**Wow**</h4>
</div>
<div class="moon">
<h4>**Great**</h4>
</div>
</div>
</div>
</div>
你问:
如何从
<img class="aye">
中获得data-original
值,同时从<h4>
标签中获得值"哇"one_answers"棒极了"?
使用XPath,您可以直接获得字符串形式的值:
string(//div[@class='fly']/img/@data-original)
这是所有class="fly"的div中img标记的第一个数据原始属性的字符串。
string(//div[@class='fly']//h4[not(following-sibling::*//h4)][1])
string(//div[@class='fly']//h4[not(following-sibling::*//h4)][2])
这些是第一个和第二个<h4>
标签的字符串值,在它自己的级别上,所有div class="fly"
中没有另一个<h4>
标签跟在它后面。
这看起来有点像现在的障碍,但随着迭代,前面的这些部分很快就不再需要了,因为那时的xpath将是相对的:
//div[@class='fly']
string(./img/@data-original)
string(.//h4[not(following-sibling::*//h4)][1])
string(.//h4[not(following-sibling::*//h4)][2])
要在PHP中使用xpath string(...)
表达式,必须使用DOMXPath::evaluate()
而不是DOMXPath::query()
。这看起来如下:
$aye = $xpath->evaluate("string(//div[@class='fly']/img/@data-original)");
$h4_1 = $xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][1])");
$h4_2 = $xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][2])");
一个完整的迭代和输出示例:
// all <div> tags with class="fly"
$divs = $xpath->evaluate("//div[@class='fly']");
foreach ($divs as $div) {
// the first data-original attribute of an <img> inside $div
echo $xpath->evaluate("string(./img/@data-original)", $div), "<br/>n";
// all <h4> tags anywhere inside the $div
$h4s = $xpath->evaluate('.//h4[not(following-sibling::*//h4)]', $div);
foreach ($h4s as $h4) {
echo $h4->nodeValue, "<br/>n";
}
}
如示例所示,您也可以对节点列表使用evaluate。从所有<h4>
获得的值不再标记为string()
,因为我假设可能不止两个。
包括特殊字符串输出的在线演示(只是示例):
echo <<<HTML
{$xpath->evaluate("string(//div[@class='fly']/img/@data-original)")}<br/>
{$xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][1])")}<br/>
{$xpath->evaluate("string(//div[@class='fly']//h4[not(following-sibling::*//h4)][2])")}<br/>
<hr/>
HTML;