xPath根据其他属性的值选择属性

时间:2015-10-21 18:47:52

标签: php xml xpath

我现在和xPath挣扎了一段时间,我觉得我现在已经掌握了它。

奇怪的是,如果我测试我的模式online它是有效的,但是当我在本地运行它时它不会

我有以下XML

<Products>
    <Product>
        <Property Title="Toy" Text="Car" />
    </Product>
</Products>

现在我想用Car替换所有Bal值,所以我提出了类似的结果:

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

foreach($xpath->evaluate('//Property[@Title="Toy"]/@Text') as $text){
        $text->data = str_replace('Car', 'Bal', $text->data);
}
echo $document->saveXml();

但是这并没有做任何事情(我只是用原始值获得整个Feed),而xPath模式在我上面提到的网站上工作。我不知道为什么

2 个答案:

答案 0 :(得分:1)

您的Xpath表达式返回DOMAttr个节点。您必须操纵$value属性。

foreach($xpath->evaluate('//Property[@Title="Toy"]/@Text') as $text) {
   $text->value = str_replace('Car', 'Bal', $text->value);
}
echo $document->saveXml();

DOMAttr有一个代表其值的DOMText子节点,但我认为不可能用Xpath解决它。文本节点将是DOMText的实例,它们将具有$data属性。

答案 1 :(得分:0)

你必须操纵DOM,而不仅仅是表示,在这种情况下意味着使用DOMElement::setAttribute

foreach($xpath->evaluate('//Property[@Title="Toy"]') as $elProperty) {
    $elProperty->setAttribute(
        'Text',
        str_replace(
            'Car',
            'Bal',
            $elProperty->getAttribute('Text')
        )
    );
}