PHP DomElement:查看元素是否是另一个元素的直接或间接子元素

时间:2014-05-08 17:21:48

标签: php xml

我们说我有以下XML:

<family>
    <father>
        <date_of_birth>1971-01-25</date_of_birth>
        <first_name>Bob</first_name>
        <last_name>Johnson</last_name>
    </father>
    <mother>
        <date_of_birth>1977-09-12</date_of_birth>
        <first_name>Mary</first_name>
        <last_name>Johnson</last_name>
    </mother>
    <child>
        <date_of_birth>2006-04-21</date_of_birth>
        <first_name>Pete</first_name>
        <last_name>Johnson</last_name>
    </child>
</family>

我决定只想使用<date_of_birth>个值。我做了以下事情:

$DOBs = $dom->getElementsByTagName("date_of_birth");

现在,我的问题是,虽然我循环了这些值:

foreach ($DOBs as $date)
{
    echo $date->nodeValue . "<br>";
}

我如何判断这些价值观是来自母亲,父亲还是孩子?有没有办法检查DomElement $ date是母亲还是父亲的孩子或孙子?基本上我需要知道这些是否在标签内(无论多深)。

修改

例如(请注意方法is_child_of已组成):

foreach ($DOBs as $date)
{
    if($date->is_child_of('father'))
    {
        //This is the father's date of birth.
    }
}

我正在寻找能告诉我<date_of_birth>在另一个元素中的东西。所以,如果我说:

if($date->is_child_of('family'))
{

}

if($date->is_child_of('father'))
{

}

这些都是正确的(假设我们正在处理父亲的date_of_birth)并且if语句中的代码将被触发。

1 个答案:

答案 0 :(得分:1)

如果您只是寻找直接父级,请使用parentNode个实例的nodeNameDOMNode属性。

对于间接父级,除了使用XPath之外,我唯一知道的就是这个函数:

function isChildOf(DOMNode $childNode, $parentNodeName)
{
    while ($childNode->parentNode)
    {
        if ($childNode->parentNode->nodeName == $parentNodeName) {
            return true;
        }
        else {
            $childNode = $childNode->parentNode;
        }
    }
    return false;
}

未经测试,使用风险自负。