【发布时间】:2011-11-10 18:16:43
【问题描述】:
如果以下内容有些混乱,请原谅,我一直在试图解决这个问题。
这是我用来为迷你 CMS 创建类别树的一段 XML(从一个非常大的站点导出)。一旦我得到了节点的值和名称,这没问题,我还需要获取每个节点的“父节点”,即在层次结构中位于它之前的节点。
<productCategory>
<genericName>DigitalCinema</genericName>
<productCategories>
<productCategory>
<genericName>DCinemaProj</genericName>
<productModels>
<productModel>ProjProd-1</productModel>
<productModel>ProjProd-2</productModel>
<productModel>ProjProd-3</productModel>
<productModel>ProjProd-4</productModel>
</productModels>
</productCategory>
<productCategory>
<genericName>DCinemaLens</genericName>
</productCategory>
</productCategories>
</productCategory>
例如,对于 productCategory-genericName DCinemaLens,我需要能够将父级获取为 DigitalCinema,对于单个 productModel 个节点,其父节点是 DCinemaProj。
我在 xpath 中使用祖先、上一个兄弟和父级尝试了各种不同的查询,但我仍然看不到抓取我需要的节点。
这是我几分钟前放弃尝试的代码。
if ($xml->xpath('//productCategories')) {
foreach($xml->xpath('//genericName | //productModel') as $genericName){
echo "<p align='center'>$genericName";
$type = $genericName->getName();
echo " - (" . $type . ") ";
$derp = $xml->xpath("ancestor::productCategory[1]/genericName");
echo $derp;
echo '</p>';
}
}
我在数组中获取信息也取得了一些成功,但它总是再次返回 XML 中的每个值。
$key = 'genericName';
$derpgleep = $derp[$key];
echo 'Derp= ' . $derpgleep;
print_r($derp);
希望我忽略了一个非常简单的解决方案。我希望我已经清楚了。
【问题讨论】:
-
好问题,+1。请参阅我的答案,了解一个完整、简短且简单的 XPath 表达式,它选择所需的节点,称为“父节点”。