@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>
  • Вопрос задан
  • 274 просмотра
Решения вопроса 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы