PHP XPath - 显示其子项的父项

时间:2014-09-25 12:10:57

标签: php xml xpath simplexml

我有以下脚本:

<?php
    $xml = '<?xml version="1.0" encoding="UTF-8"?>
            <root>
                <category id="1" sort="00A125698" name="Kitchen">
                    <good id="122"/>
                    <good id="315"/>
                    <good id="94"/>
                </category>
                <category id="2" sort="00B354565" name="Dining room">
                    <good id="441"/>
                    <good id="122"/>
                    <good id="521"/>
                </category>
                <category id="3" sort="00A259875" name="Chairs">
                    <good id="335"/>
                    <good id="225"/>
                </category>
            </root>';

    $data = simplexml_load_string($xml);
    $cat_name = $data->xpath("/root/category[contains(@sort, '00A')] && /root/category/good[@id='122']");

    $cat_name_cnt = count($cat_name);
    for($i = 0; $i <$cat_name_cnt; $i++){
        echo $cat_name[$i]->attributes()->name;
        echo '<BR />';
    }
?>

我不知道是否可能,但我尝试做类似的事情:显示属性排序以“00A”开头的类别的名称,其子项的id是122.我知道第一部分XPath是对的,但我不知道如何做“其孩子是”的部分。

输出应该是Kitchen。

我知道可以显示排序开始为00A的所有类别名称,然后如果商品数组包含122,则可以在PHP中进行测试。但我认为如果可能的话,在XPath中立即使用它会更快。

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,这很可能,实际上你几乎就在那里。例如:

$data = simplexml_load_string($xml);
$cat_name = $data->xpath("/root/category[contains(@sort, '00A')][descendant::good[@id='122']]");
if(count($cat_name) > 0) {
    $element = $cat_name[0];
    $name = (string) $element->attributes()->name;
    echo $name; // kitchen
}