我现在和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模式在我上面提到的网站上工作。我不知道为什么
答案 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')
)
);
}