gpt4 book ai didi

php - 使用 php xPath 更改先前的同级值

转载 作者:行者123 更新时间:2023-12-01 18:00:51 25 4
gpt4 key购买 nike

我遇到了一种让我发疯的情况。我想在我的 feed 中搜索具有特定值(从数组派生)的元素,如果找到该值,则更改其前一个同级元素的值。

我的提要如下所示

<products>
<product>
<properties>
<property name="category">
<value>Fruits</value>
</property>
<property name="item">
<value>Banana</value>
</property>
</properties>
</product>
<product>
<properties>
<property name="category">
<value>Fruits</value>
</property>
<property name="item">
<value>Apple</value>
</property>
</properties>
</product>
<product>
<properties>
<property name="category">
<value>Fruits</value>
</property>
<property name="item">
<value>Carrot</value>
</property>
</properties>
</product>
</products>

如您所见,提要中可能存在一些错误。对于这些实例,我创建了一个具有适当值的数组,如下所示:

$replacements = Array(
"Carrot" => "Vegetable"
);

现在我想选择每个 property ,其属性 item 的值与 $replacements 的键相同,然后选择具有属性 category 的前一个同级元素,并使用匹配的 $replacements 的值更改此值。

我想出了这个,但这只会给我一个白屏,根本没有输出

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

$query = '//property[@name = "item"]';
$entries = $xpath->query($query);

foreach ($entries as $entry) {
if(array_key_exists($entry->nodeValue,$replacements)){
$entry->previousSibling->previousSibling->nodeValue = $replacements[$entries->nodeValue];
}
}

但我不明白为什么它不输出任何内容

最佳答案

这里有一些事情有点不对劲:

array_key_exists($entry->nodeValue,$replacements)

nodeValue 将包含属性元素及其后代中的所有文本内容 - 包括换行符和空格。

... = $replacements[$entries->nodeValue];

您可能正在寻找 $replacements[$entry->nodeValue] 但您又遇到了与上述空白相同的问题。不仅如此,您还需要用文本替换之前属性的整个nodeValue,如下所示:

<property name="category">
<value>Fruits</value>
</property>

会变成:

<property name="category">Vegetable</property>
<小时/>

为了解决这一切,我建议调整查询,以及如何处理要替换的目标值,以摆脱 ->previousSibling->previousSibling 链并且更明确一点。

示例:

foreach ($xpath->query('//property[@name="item"]/value') as $node) {
if (array_key_exists(trim($node->textContent), $replacements)) {

$target = $xpath->query(
'preceding-sibling::property/value/text()',
$node->parentNode
)->item(0);

$target->parentNode->replaceChild(
$dom->createTextNode($replacements[trim($node->textContent)]),
$target
);

}
}

echo $dom->saveXML();

输出:

    ...
<product>
<properties>
<property name="category">
<value>Vegetable</value>
</property>
<property name="item">
<value>Carrot</value>
</property>
</properties>
</product>
</products>

关于php - 使用 php xPath 更改先前的同级值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com