使用PHP和xpath获取祖先节点
请原谅如果以下有点混乱,我一直在努力解决这个问题.
这是我用来为mini-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); 希望我能忽略一个非常简单的解决方案.我希望我已经清楚了. 解决方法
您正在使用的XPath表达式:
ancestor::productCategory[1]/genericName 如果你能够从当前节点开始执行该表达式将会工作.从当前的Array $genericName开始,这是不可能的,因为它不包含父类,也不包含祖先. 我认为您的选择是重新遍历所有XML树.这是一个样本测试,根据您的输入样本,根据需要运行. <?php $xml = simplexml_load_file("test_input1.xml"); if ($xml->xpath('//productCategories')) { foreach($xml->xpath('//genericName') as $genericName){ echo "<p align='center'>$genericName"; $type = $genericName->getName(); echo " - (" . $type . ") "; $derp = $xml->xpath("//genericName[.='" . $genericName[0] . "']/ancestor::productCategory[2]/genericName"); echo $derp[0]; echo "</p>n"; } } ?> 这将打印出以下HTML片段: <p align='center'>DigitalCinema - (genericName) </p> <p align='center'>DCinemaProj - (genericName) DigitalCinema</p> <p align='center'>DCinemaLens - (genericName) DigitalCinema</p> 要获得productModel的“父”,您需要一个xpath,如: $derp = $xml->xpath("//productModel[.='" . $productModel[0] . "']/parent::productCategory[1]/genericName"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |