0

我尝试了各种方法,但找不到解决方案。我想在 php 中使用 xpath 从 html 代码中检索元素。

前任:

<div class='student'>
 <div class='name'>Michael</div>
 <div class='age'>26</div>
</div>
<div class='student'>
 <div class='name'>Joseph</div>
 <div class='age'>27</div>
</div>

我想检索信息并将它们放在一个数组中,如下所示:

$student[0][name] = Michael;
$student[0][age] = 26;
$student[1][name] = Joseph;
$student[1][age] = 27;`

换句话说,我希望匹配的年龄与名称保持一致。

我尝试了以下方法:

$dom = new DOMDocument();
$dom->loadHTML($html);
$xpathDom = new DomXPath($dom);
$homepostcontentNodes = $xpathDom->query("//*[contains(@class, 'student')]//*[contains(@class, 'name')]");`

但是,这只是抓住我的节点“名称”我怎样才能获得匹配的年龄节点?

4

1 回答 1

2

当然它只是抓取节点name- 你告诉它!

您需要做的是分两个步骤:

  1. 挑选出所有学生节点
  2. 对于每个学生节点,选择列

这是数据线性化的一个非常标准的步骤,XPath 查询很简单:

步骤1

你几乎拥有它:

 $studentNodes = $xpathDom->query("//div[contains(@class, 'student')]");

这将返回您的所有student节点。

第2步

这就是魔法发生的地方。我们有我们的节点,我们可以循环它们(DOMNodeListimplements Iterator,所以我们可以循环foreach它们)。我们需要弄清楚的是如何找到它的孩子......

...等一下。DOMNode实现了一个方法getNodePath,该方法返回到节点的完整、直接的 XPath 路径。这使我们可以简单地追加/div以获取所有 div 直接后代到节点!

另一个快速 foreach,我们得到以下代码:

$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]");
$result = array();
foreach ($studentNodes as $v) {
// Child nodes: student
$r = array();
$columns = $xpathDom->query($v->getNodePath()."/div");
foreach ($columns as $v2) {
           // Attributes allows me to get the 'class' property of the node. Bit clunky, but there's no alternative
    $r[$v2->attributes->getNamedItem("class")->textContent] = $v2->textContent;
}
$result[] = $r;
}
var_dump($result);

完整的小提琴:http ://codepad.viper-7.com/t868Wh

于 2013-05-28T00:06:52.157 回答