使用xPath选择第n个类型的下一个兄弟

时间:2015-10-23 19:20:41

标签: php xpath

我需要的是在xml Feed中搜索某个值,并根据此值更改兄弟的值。

我有这样的结构

<properties>
    <property name="sport">
        <value>Football</value>
    </property>
    <property name="player">
        <value>Lionel Messi</value>
    </property>
    <property name="nationality">
        <value>Argentine</value>
    </property>
    <property name="club">
        <value>FC Barcelona</value>
    </property>
    <property name="position">
        <value>Forward</value>
    </property>
</properties>

现在我知道某些值可能不正确或不一致,所以我创建了一个带有更正的数组,如下所示:

$position_replacements = Array(
    'Lionel Messi' => 'Center forward',
);

我认为这样的事情应该有效,但不知怎的,我不知道为什么......

$xml_src = 'players.xml';
$document = new DOMDocument();
$document->load($xml_src);
$xpath = new DOMXpath($document);

foreach($xpath->query('//property[@name="player"]') as $node){
    if(array_key_exists(trim($node->nodeValue), $position_replacements)){
        $target = $xpath->query('following-sibling::property[@name="position"]/value/text()', $node);
        $target->parentNode->replaceChild(
            $document->createTextNode($position_replacements[trim($node->textContent)]),
            $target
        );
    }
}

到目前为止,我知道问题出在$target查询中,但我不知道解决此问题的方法。我做错了什么?

我刚回来了一个空白页

1 个答案:

答案 0 :(得分:0)

夜间睡眠为我提供了解决问题的见解。我忘了选择te项目,所以有效的代码是

$xml_src = 'players.xml';
$document = new DOMDocument();
$document->load($xml_src);
$xpath = new DOMXpath($document);

foreach($xpath->query('//property[@name="player"]') as $node){
    if(array_key_exists(trim($node->nodeValue), $position_replacements)){
        $target = $xpath->query(
            'following-sibling::property/value/text()',
            $node->parentNode
        )->item(3);
        $target->parentNode->replaceChild(
            $document->createTextNode($position_replacements[trim($node->textContent)]),
            $target
        );
    }
}