Предположим, что следующий XML-документ
<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 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($datei);
Но теперь $ inhalt – это объект, где я не могу использовать eg str_ireplace (string remove, string add, $ inhalt); Поэтому, если я, например, хочу что-то заменить, мне нужно войти в каждую часть документа xml, чтобы иметь возможность ее заменить;
Поэтому я делаю это:
$name = $inhalt->name; $name = str_ireplace(string remove, string add,$name); $numbers = $inhalt ->numbers; $numbers = str_ireplace(string remove, string add,$numbers); $shortinfo=$inhalt ->shortinfo; str_ireplace(string remove, string add,$shortinfo); $detailedinfo=$inhalt ->detailedinfo; str_ireplace(string remove, string add,$detailedinfo);
и так далее;
Итак, вы знаете, как я могу что-то заменить для всей части тела, а не только ее частей? Итак, некоторая версия:
$inhalt = str_ireplace(string remove, string add,$inhalt);
который в этом случае не работает?
Извините, я знаю, что это звучит совершенно просто и глупо, но я – чертов новичок;
Большое спасибо!! 🙂
вы можете пропустить все дочерние элементы вашего объекта xml следующим образом:
foreach ($inhalt->children() as $child) { $child= str_ireplace(string remove, string add,$child); }
Надеюсь, поможет
Это проще в DOM, потому что вы можете напрямую обращаться и изменять текстовые узлы (включая разделы CDATA):
$document = new DOMDocument(); $document->loadXml($xml); $xpath = new DOMXpath($document); foreach ($xpath->evaluate('/technicaldata/*//text()') as $textNode) { $textNode->data = str_replace(['hi', 'ha'], ['foo', 'bar'], $textNode->data); } echo $document->saveXml();
В элементе документа technicaldata
извлекается любой элемент узла …
/technicaldata/*
… извлекать текстовый узел (простые разделы текста или cdata) внутри них:
/technicaldata/*//text()