@xFRAPS

Как с помощью xPath выполнить замену?

Добрый день!
Нужно заменить picture на picture1, picture2, picture3... внутри XML файла и вывести весь XML.
XML:
<offers>
<offer id="1" available="true">
<url>
http://localhost.com/
</url>
<name>Название</name>
<picture>
http://localhost.com/pic1.png
</picture>
<picture>
http://localhost.com/pic2.png
</picture>
</offer>
</offers>



<offer id="2" available="true">
<url>
http://localhost.com/
</url>
<name>Название</name>
<picture>
http://localhost.com/pic3.png
</picture>
<picture>
http://localhost.com/pic4.png
</picture>
</offer>
</offers>
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
@bears
Например так:
$string = <<<XML
<offers>
<offer id="1" available="true">
<url>
http://localhost.com/
</url>
<name>Название</name>
<picture>
http://localhost.com/pic1.png
</picture>
<picture>
http://localhost.com/pic2.png
</picture>
</offer>


<offer id="2" available="true">
<url>
http://localhost.com/
</url>
<name>Название</name>
<picture>
http://localhost.com/pic3.png
</picture>
<picture>
http://localhost.com/pic4.png
</picture>
<picture>
http://localhost.com/pic5.png
</picture>
</offer>
</offers>
XML;

$dom = new DOMDocument();
$dom->loadXML($string);

$domXpath = new DOMXpath($dom);

for ($i = 0; $i < $dom->getElementsByTagName('offer')->length; $i++) {
    $xpath = sprintf('//offer[%d]/picture', $i + 1);
    $pics = [];
    $pictures = $domXpath->query($xpath);
    foreach ($pictures as $k => $picture) {
        $pics[] = trim($picture->nodeValue);

        if ($k > 0) {
            $picture->parentNode->removeChild($picture);
        }
    }

    if ($pictures->length > 0) {
        $pictures->item(0)->nodeValue = implode(' | ', $pics);
    }
}

echo $dom->saveXML();

Рабочий пример
Но если работа более глобальная, то лучше использовать готовые библиотеки, например DomCrawler
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы