gpt4 book ai didi

php - 使用 PHP 和 xpath 获取祖先节点

转载 作者:可可西里 更新时间:2023-10-31 23:24:56 24 4
gpt4 key购买 nike

如果以下内容有点困惑,请原谅,我一直在努力解决这个问题。

这是我用来为迷你 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 开始,因为它不包含 parent ,也不包含祖先。

我认为您的选择是重新遍历所有 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");

关于php - 使用 PHP 和 xpath 获取祖先节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com