【问题标题】:How to get all XML nodes with XPath in PHP that contain a certain child node如何在 PHP 中使用 XPath 获取包含某个子节点的所有 XML 节点
【发布时间】:2017-05-25 22:11:48
【问题描述】:

我正在尝试找到一种方法来正确使用 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);
}

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

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

【问题讨论】:

    标签: php xml xpath


    【解决方案1】:

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

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

    //Items/Item[Locations/Location[contains(.,'E')]]
    

    【讨论】:

      【解决方案2】:

      改变这个

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

      进入这个

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

      修复了问题,物品现在可以正常显示了。

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 2014-08-17
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        相关资源
        最近更新 更多