xpath获取Node的Parent

时间:2017-10-13 08:31:49

标签: php xml xpath

我有以下XML(来自HP iLO)

<GET_EMBEDDED_HEALTH_DATA>
    <FIRMWARE_INFORMATION>
        <INDEX_1>
            <FIRMWARE_NAME VALUE = "HP ProLiant System ROM"/>
            <FIRMWARE_VERSION VALUE = "12/14/2012"/>
        </INDEX_1>
        <INDEX_2>
            <FIRMWARE_NAME VALUE = "HP ProLiant System ROM - Backup"/>
            <FIRMWARE_VERSION VALUE = "12/14/2012"/>
        </INDEX_2>
        <INDEX_3>
            <FIRMWARE_NAME VALUE = "HP ProLiant System ROM Bootblock"/>
            <FIRMWARE_VERSION VALUE = "03/11/2012"/>
        </INDEX_3>
        <INDEX_4>
            <FIRMWARE_NAME VALUE = "iLO"/>
            <FIRMWARE_VERSION VALUE = "1.13 Nov 08 2012"/>
        </INDEX_4>
        <INDEX_5>
            <FIRMWARE_NAME VALUE = "Power Management Controller Firmware"/>
            <FIRMWARE_VERSION VALUE = "3.1"/>
        </INDEX_5>
    </FIRMWARE_INFORMATION>
</GET_EMBEDDED_HEALTH_DATA>

我正在使用PHP SimpleXML Xpath,我想查找iLO版本并选择父版本,但是父版本位于未知节点中(因为它可能位于INDEX节点中。

我设法做到这一点:

$ilover = $xml->FIRMWARE_INFORMATION->xpath("//FIRMWARE_NAME[@VALUE='iLO']");

返回带有iLO版本的节点,但我还需要包含所选节点旁边的FIRMWARE_VERSION的节点。

是否有可能获得: 1.如上所述搜索我的节点,但选择父节点 2.如上所述搜索我的节点,然后从当前节点旁边的其他节点返回数据

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

您可以使用以下XPath获取FIRMWARE_NAME的父元素,其中VALUE属性等于'iLO':

$ilover = $xml->FIRMWARE_INFORMATION->xpath("*[FIRMWARE_NAME/@VALUE='iLO']");

或返回FIRMWARE_VERSION而不是父元素:

//*[FIRMWARE_NAME/@VALUE='iLO']/FIRMWARE_VERSION

答案 1 :(得分:1)

尝试以下方法:

$ilover = $xml->FIRMWARE_INFORMATION->xpath("//FIRMWARE_NAME[@VALUE='iLO']")[0]->xpath('parent::*');

它将为您提供父节点,然后您可以获得两个子节点,如:

var_dump($ilover[0]->FIRMWARE_NAME);
var_dump($ilover[0]->FIRMWARE_VERSION);