如何在PHP中使用包含特定子节点

时间:2017-05-25 22:11:49

标签: php xml xpath

我正试图找到一种方法,如何正确使用xpath来选择某些元素,我的解决方案部分工作,我不知道如何解决它。

以下是xml示例:

<Database>
    <Items>
        <Item>
            <Name>A</Name>
            <Locations>
                <Location>A</Location>
                <Location>B</Location>
                <Location>C</Location>
            </Locations>
        </Item>
        <Item>
            <Name>B</Name>
            <Locations>
                <Location>E</Location>
            </Locations>
        </Item>
        <Item>
            <Name>C</Name>
            <Locations>
                <Location>D</Location>
                <Location>E</Location>
            </Locations>
        </Item>
    </Items>
</Database>

我正在使用这个PHP代码来获取包含位置“E”的所有项目

$LocationFilter = "E" //hard written, it's actually a GET param
$filter = $xml->xpath("//Items/Item[contains(Locations/Location,'".$LocationFilter."')]");

foreach ($filter as $Item) {
    echo($filter->Name);
}

而不是获得BC(项目的名称),我只获得B,换句话说,我只获得第一个位置为E的项目,而不是所有在任何位置包含E的项目。

我不确定为什么这不起作用,但我希望我已经解释得很好。

2 个答案:

答案 0 :(得分:2)

contains()期望将singleton作为第一个参数传递。如果收到多个节点,则仅评估第一个节点。这解释了为什么XPath在您的测试中没有返回名称为Item的{​​{1}}。

在您必须使用C的情况下,正确的方法是在单个contains()元素上应用该方法:

Location

答案 1 :(得分:0)

更改此

train_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(
        'data/train/',
        classes=['class1','class2','class3','class4','class5'],
        target_size=(64, 64),
        class_mode='categorical')

进入这个

$filter = $xml->xpath("//Items/Item[contains(Locations/Location,'".$LocationFilter."')]");

修复了问题,现在项目正常显示。