Есть ли способ получить значение узла из объекта simplexml
без его литья?
$amount = (int)$item->amount;
По-моему, это не очень красиво, я ищу более чистый способ, но ничего не нашел!
//wouldn't this be nice? $amount = $item->amount->getValue();
Заранее спасибо.
Получение значения узла без необходимости его выводить? Конечно! : 3
class SimplerXMLElement extends SimpleXMLElement { public function getValue() { return (string) $this; } }
Теперь вам просто нужно использовать второй параметр simplexml_load_string()
чтобы получить еще более простые XML-элементы!
Более серьезно, хотя узел является узлом. Если вам нужно использовать значение узла как строку, целое число, а что нет, оно будет включать в себя тождество в тот или иной момент, независимо от того, сделаете ли вы это лично или нет.
Нет. SimpleXml
предоставляет только очень ограниченный API для работы с узлами. Это неявный API считается признаком. Если вам нужен больший контроль над узлами, используйте DOM
:
$sxe = simplexml_load_string( '<root><item><amount>10</amount></item></root>' ); $node = dom_import_simplexml($sxe->item->amount); var_dump($node->nodeValue); // string(2) "10"
Функция dom_import_simplexml
преобразует узел из SimpleXmlElement
в DOMElement
, так что вы все равно DOMElement
за кулисы. Вам больше не нужно явно DOMElement
при DOMElement
содержимого из DOMElement
.
На стороне: лично я нахожу DOM
выше SimpleXml
и я предлагаю не использовать SimpleXml
а DOM
сразу. Если вы хотите ознакомиться с ним, ознакомьтесь с некоторыми из моих предыдущих ответов об использовании DOM .
Но это самое безопасное :). Вы можете создать функцию для рекурсивного преобразования объекта в массив. Вернемся назад, когда я впервые начал работать с XML в PHP, я помню, что пришел к выводу, что литье типов – это лучший метод 🙂
Как насчет пути xpath?
$amount = $item->amount->xpath('text()');