Предположим, что следующий 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... :)
Много сказано о скрытых полномочиях 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
foreach(... as &$child)...
обратите внимание на&
.