Intereting Posts
Вызов функции-функции-члена () для не-объекта в запросе ()? Синхронизировать удаленную и локальную базу данных MySQL с помощью phpMyAdmin Сериализация «Symfony \ Component \ HttpFoundation \ File \ UploadedFile» не допускается API электронной таблицы Google, как вставить новую строку Ошибка PHP ftp_put Простой PHP / MySQL Создание сценария таблицы Выберите активную запись Codeigniter, левое соединение, количество Как получить точное значение из массива – php Каким образом сеансовая система codeigniter разделяется с PHP, встроенным в $ _SESSION? Почему невозможно запустить исполняемый файл с функциями exec () или system ()? PDO-эквивалент mysql_fetch_array Путь загрузки в Codeigniter возвращает «путь загрузки, кажется, недействителен» Изменение размера изображения в PHP в пределах определенной области Libreoffice –headless отказывается конвертировать, если не root, не будет работать с PHP-скриптом Оболочка для Symfony

Как установить текстовое значение SimpleXmlElement без использования его родительского элемента?

Я хочу установить текст некоторого узла, найденного с помощью xpath ()

<?php $args = new SimpleXmlElement( <<<XML <a> <b> <c>text</c> <c>stuff</c> </b> <d> <c>code</c> </d> </a> XML ); // I want to set text of some node found by xpath // Let's take (//c) for example // convoluted and I can't be sure I'm setting right node $firstC = reset($args->xpath("//c[1]/parent::*")); $firstC->c[0] = "test 1"; // like here: Found node is not actually third in its parent. $firstC = reset($args->xpath("(//c)[3]/parent::*")); $firstC->c[2] = "test 2"; // following won't work for obvious reasons, // some setText() method would be perfect but I can't find nothing similar, $firstC = reset($args->xpath("//c[1]")); $firstC = "test"; // maybe there's some hack for it? $firstC = reset($args->xpath("//c[1]")); $firstC->{"."} = "test"; // nope, just adds child named . $firstC->{""} = "test"; // still not right, 'Cannot write or create unnamed element' $firstC["."] = "test"; // still no luck, adds attribute named . $firstC[""] = "test"; // still no luck, 'Cannot write or create unnamed attribute' $firstC->addChild('','test'); // grr, 'SimpleXMLElement::addChild(): Element name is required' $firstC->addChild('.','test'); // just adds another child with name . echo $args->asXML(); // it outputs: // // PHP Warning: main(): Cannot add element c number 2 when only 1 such elements exist // PHP Warning: main(): Cannot write or create unnamed element // PHP Warning: main(): Cannot write or create unnamed attribute // PHP Warning: SimpleXMLElement::addChild(): Element name is required // <?xml version="1.0"? > // <a> // <b> // <c .="test">test 1<.>test</.><.>test</.></c> // <c>stuff</c> // </b> // <d> // <c>code</c> // <c>test 2</c></d> // </a> 

Вы можете сделать с самооценкой SimpleXMLElement :

 $firstC->{0} = "Victory!!"; // hackity, hack, hack! // -or- $firstC[0] = "Victory!!"; 

найденный после просмотра

 var_dump((array) reset($xml->xpath("(//c)[3]"))) 

Это также работает с unset операциями, как указано в ответе на :

  • Удалить ребенка с определенным атрибутом, в SimpleXML для PHP

Реальный ответ: вы не можете.

С другой стороны, для этого вы можете использовать DOM , например

 dom_import_simplexml($node)->nodeValue = 'foo';