Comments 13
UFO just landed and posted this here
На StackOverflow есть замечательный ответ про библиотеку из PEAR. Она еще и массивы конвертит и не работает через DOM Document, обходясь конкатенацией:
stackoverflow.com/questions/137021/php-object-as-xml-document
stackoverflow.com/questions/137021/php-object-as-xml-document
+3
Могу сказать только «Спасибо»
0
Мало-ли кому будет интересно, написал простой пример на codepad для для многомерного массива и сложного обьекта.
+1
1) Извините, но это, как бы сказать по-мягче, глупость — сначала создавать DOM объект, а потом конвертировать его в simplexml/строку, который потом будет снова конвертирован в DOM.
2) Хм, ну не знаю — вообще то в DOMDocument::createElement ( string $name [, string $value ] ), под $value понимается текстовое значение, для добавления детей нужно использовать DOMNode->appendChild()
3) Наличие html_entity_decode от непонимания — см. предыдущий пункт.
4) Я бы с удовольствием оторвал вам руки за то, что функция std2simplexml при передаче одних агрументов возвращает SimpleXMLElement, а при других строку.
5) Охренеть, а зачем?!
$new_xml = str_replace(array('','',''),'',$new_xml);
Вывод: Говнокод. Выбросьте. Не позорьтесь.
2) Хм, ну не знаю — вообще то в DOMDocument::createElement ( string $name [, string $value ] ), под $value понимается текстовое значение, для добавления детей нужно использовать DOMNode->appendChild()
3) Наличие html_entity_decode от непонимания — см. предыдущий пункт.
4) Я бы с удовольствием оторвал вам руки за то, что функция std2simplexml при передаче одних агрументов возвращает SimpleXMLElement, а при других строку.
5) Охренеть, а зачем?!
$new_xml = str_replace(array('','',''),'',$new_xml);
Вывод: Говнокод. Выбросьте. Не позорьтесь.
+3
SimpleXMLElement может быть полезен только в том случае, когда в вас уже есть XML строка, да и то только тем, что код будет немного короче.
0
Да, но насколько я понимаю XSLTProcessor::transformToXML принимает только DOMDocument, поправьте, если ошибаюсь. Или вы вы имеете в виду, что вместо него нужно было использовать DOMDocument?
0
Судя по документации:
string XSLTProcessor::transformToXML ( DOMDocument $doc )
Однако, в комментах есть пример и с SimpleXMLElement (http://php.net/manual/en/book.xsl.php) + да и ваш код его же принимает, разве нет?
> что вместо него нужно было использовать DOMDocument?
В данном случае да.
6) У вас создается новый DOMDocument при каждом вызове функции. Зачем?
string XSLTProcessor::transformToXML ( DOMDocument $doc )
Однако, в комментах есть пример и с SimpleXMLElement (http://php.net/manual/en/book.xsl.php) + да и ваш код его же принимает, разве нет?
> что вместо него нужно было использовать DOMDocument?
В данном случае да.
6) У вас создается новый DOMDocument при каждом вызове функции. Зачем?
0
Если бы я не позорился, уважаемый DeusModus не смог бы указать мне на XMLSerializer.
Насчет 5-го пункта, там видимо раньше было что-то более осмысленное, упустил из виду.
Насчет 4-го пункта, что вы увидели в этом такого криминального (нет, я серьезно, объясните)? По задумке строка должна была возвращаться только в случае рекурсии, а второй аргумент передавать только внутри функции.
Насчет 5-го пункта, там видимо раньше было что-то более осмысленное, упустил из виду.
Насчет 4-го пункта, что вы увидели в этом такого криминального (нет, я серьезно, объясните)? По задумке строка должна была возвращаться только в случае рекурсии, а второй аргумент передавать только внутри функции.
+1
> Если бы я не позорился, уважаемый DeusModus не смог бы указать мне на XMLSerializer.
Опыта у вас мало? Я прав?
> Насчет 4-го пункта, что вы увидели в этом такого криминального (нет, я серьезно, объясните)?
В этом то и проблема, при поддержке это боком выйдет, т.к. название и поведение этой функции подразумевает получение SimpleXMLElement. Пройдет время и кому то понадобится получить SimpleXMLElement, но без вложенных элементов — вот радости то ему привалит…
— Наиболее логично функция выглядела бы так (псевдо код):
/**
* @param mixed $object конвертируемый объект
* @param bool $recursive нужно ли обрабатывать вложенные элементы?
* @param DOMNode $parent родительский узел
*
* @return DOMNode
*/
function convertToDom($object, $recursive, $parent = null);
// 1
$node = convertToDom($object, true, new DOMDocument()); // DOMDocument
$html = (new XSLTProcessor())->transformToXML($node);
// 2
$node = convertToDom($object, true); // DOMNode
$html = (new XSLTProcessor())->transformToDoc($node)->saveXML();
Опыта у вас мало? Я прав?
> Насчет 4-го пункта, что вы увидели в этом такого криминального (нет, я серьезно, объясните)?
В этом то и проблема, при поддержке это боком выйдет, т.к. название и поведение этой функции подразумевает получение SimpleXMLElement. Пройдет время и кому то понадобится получить SimpleXMLElement, но без вложенных элементов — вот радости то ему привалит…
— Наиболее логично функция выглядела бы так (псевдо код):
/**
* @param mixed $object конвертируемый объект
* @param bool $recursive нужно ли обрабатывать вложенные элементы?
* @param DOMNode $parent родительский узел
*
* @return DOMNode
*/
function convertToDom($object, $recursive, $parent = null);
// 1
$node = convertToDom($object, true, new DOMDocument()); // DOMDocument
$html = (new XSLTProcessor())->transformToXML($node);
// 2
$node = convertToDom($object, true); // DOMNode
$html = (new XSLTProcessor())->transformToDoc($node)->saveXML();
0
Это должны быть разные функции, не должен у функции тип результата зависеть от параметра, это слишком неочевидно. Более того, булевские флаги в функции говорят о том, что она делает больше одного дела, следовательно ее надо разбивать на несколько простых.
0
кошерный враппер:
github.com/nin-jin/so/blob/master/Dom/test/index.php
github.com/nin-jin/so/blob/master/Dom/test/index.php
0
Sign up to leave a comment.
Функция конвертации stdClass в SimpleXml