Сохранить изменения в цикле foreach?

1

Предположим, что следующий XML-документ:

<?xml version="1.0"?>
<technicaldata template="123">
    <name>
        <![CDATA[Blub1]]>
    </name>
    <numbers>
        <![CDATA[1
            2
            3
            4
        5]]>
    </numbers>
    <shortinfo>
        <![CDATA[ha ha ha ha ha ha ha ha.]]>
    </shortinfo>
    <detailedinfo>
        <![CDATA[hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi
        hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi ]]>
    </detailedinfo>
</technicaldata>

Теперь я могу загрузить файл через simplexml;

$data='test.xml';
$inhalt = simplexml_load_file($data);

После этого я хочу заменить некоторые конкретные буквы во всех частях xml файла - например, все проявления бара должны быть заменены на foo... благодаря этому большому сообществу, я знаю, что он работает с таким циклом:

foreach ($inhalt->children() as $child) {
    $child= str_ireplace('bar', 'foo',$child);
}

Проблема в том, что если я сейчас перейду к $inhalt-> shortinfo, это не сработает...

Но если я использую цикл с таким эхом, как это

foreach ($inhalt->children() as $child) {
    $child= str_ireplace('bar', 'foo',$child);
    echo $child;
}

Тогда замена явно работала, но, к сожалению, изменения теряются при завершении цикла forech; Как я могу избежать этого? Большое спасибо!! :)

EDIT: Извините, я говорю о php... :)

  • 0
    Используйте ссылку в цикле: foreach(... as &$child)... обратите внимание на & .
  • 0
    Эй .. Спасибо за вашу помощь ... при этом я получаю, к сожалению, ошибку; Неустранимая ошибка: нельзя использовать итератор с foreach по ссылке в C: \ xampp \ htdocs \ getxmldata.php в строке 12
Показать ещё 5 комментариев
Теги:
object
foreach

1 ответ

1

Много сказано о скрытых полномочиях SimpleXml, вот как это сделать:

$inhalt = simplexml_load_string($x); // assume XML in $x

foreach ($inhalt->children() as $child) {
    $child[0] = str_ireplace('bar', 'foo', $child);
}

echo $inhalt->asXML();

Обратите внимание на self-reference $child[0] внутри цикла foreach.
Есть пара действительно хорошо объясненных ответов на эту технику, см. Удаление ребенка с определенным атрибутом, в SimpleXML для PHP

см. приведенный выше код: https://eval.in/464546

  • 0
    Это классно; скоро пригодится

Ещё вопросы

Сообщество Overcoder
Наверх
Меню