Принуждение объекта SimpleXML к строке, независимо от контекста

Допустим, у меня есть такой XML, как этот

<channel> <item> <title>This is title 1</title> </item> </channel> 

Следующий код делает то, что я хочу, поскольку он выводит заголовок в виде строки

  • Как избежать isset () и empty ()
  • Как изменить путь к php.ini в версии PHP CLI
  • Существует ли прецедент для одиночных игр с доступом к базе данных в PHP?
  • Анализ CSS по регулярному выражению
  • Где PHP хранит журнал ошибок? (php5, apache, fastcgi, cpanel)
  • Как получить доступ к объекту объекта (элемента stdClass Object) элемента / элемента массива?
  •  $xml = simplexml_load_string($xmlstring); echo $xml->channel->item->title; 

    Вот моя проблема. В приведенном ниже коде не рассматривается заголовок как строка в этом контексте, поэтому я получаю объект SimpleXML в массиве вместо строки.

     $foo = array( $xml->channel->item->title ); 

    Я работал вокруг этого, как это

     $foo = array( sprintf("%s",$xml->channel->item->title) ); 

    но это кажется уродливым.

    Каков наилучший способ заставить объект SimpleXML к строке, независимо от контекста?

  • Как создать пользовательские URL-адреса с поддержкой SEO в OpenCart?
  • Отправка изображений из элементов Canvas с использованием Ajax и PHP $ _FILES
  • Как я могу выполнить PHP-скрипт из Java?
  • Проверьте, был ли файл включен или загружен
  • PHP не может загрузить расширение php_curl.dll
  • Запросы PHP PDO MySQL
  • 8 Solutions collect form web for “Принуждение объекта SimpleXML к строке, независимо от контекста”

    Typecast the SimpleXMLObject для строки:

     $foo = array( (string) $xml->channel->item->title ); 

    Вышеупомянутый код внутренне вызывает __toString() в объекте SimpleXMLObject. Этот метод не является общедоступным, так как он мешает схеме сопоставления объекта SimpleXMLObject, но он все равно может быть вызван указанным выше способом.

    Вы можете использовать функцию PHP

     strval(); 

    Эта функция возвращает строковые значения переданного параметра.

    Существует собственный метод SimpleXML SimpleXMLElement :: asXML В зависимости от параметра он записывает SimpleXMLElement в файл xml 1.0 или просто в строку:

     $xml = new SimpleXMLElement($string); $validfilename = '/temp/mylist.xml'; $xml->asXML($validfilename); // to a file echo $xml->asXML(); // to a string 

    Еще один уродливый способ сделать это:

     $foo = array( $xml->channel->item->title."" ); 

    Это работает, но это некрасиво.

    Чтобы получить XML-данные в php-массив, вы делаете это:

     // this gets all the outer levels into an associative php array $header = array(); foreach($xml->children() as $child) { $header[$child->getName()] = sprintf("%s", $child); } echo "<pre>\n"; print_r($header); echo "</pre>"; 

    Чтобы получить дочерний ребенок, просто выполните это:

     $data = array(); foreach($xml->data->children() as $child) { $header[$child->getName()] = sprintf("%s", $child); } echo "<pre>\n"; print_r($data); echo "</pre>"; 

    Вы можете развернуть $ xml-> через каждый уровень, пока не получите то, что хотите. Вы также можете поместить все узлы в один массив без уровней или просто любым другим способом, которым вы хотите.

    Принятый ответ на самом деле возвращает массив, содержащий строку, что не совсем то, что запрошено OP (строка). Чтобы расширить этот ответ, используйте:

     $foo = [ (string) $xml->channel->item->title ][0]; 

    Что возвращает единственный элемент массива, строку.

    Попробуйте strval ($ xml-> channel-> item-> title)

    Ниже приведена рекурсивная функция, которая будет отображать все элементы с одним дочерним элементом в String :

     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FUNCTION - CLEAN SIMPLE XML OBJECT ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function cleanSimpleXML($xmlObject = ''){ // LOOP CHILDREN foreach ($xmlObject->children() as $child) { // IF CONTAINS MULTIPLE CHILDREN if(count($child->children()) > 1 ){ // RECURSE $child = cleanSimpleXML($child); }else{ // CAST $child = (string)$child; } } // RETURN CLEAN OBJECT return $xmlObject; } // END FUNCTION 
    PHP is the Best Programming Language in the world.