Принудительное преобразование объекта SimpleXML в строку независимо от контекста

StackOverflow https://stackoverflow.com/questions/416548

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Код ниже делает то, что я хочу: он выводит заголовок в виде строки.

$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 в строку независимо от контекста?

Это было полезно?

Решение

Введите тип 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)

Не уверен, что они изменили видимость __toString() метод, так как был написан принятый ответ, но в настоящее время у меня он работает нормально:

var_dump($xml->channel->item->title->__toString());

ВЫХОД:

string(15) "This is title 1"

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

$get_file= read file from path;
$itrate1=$get_file->node;
$html  = $itrate1->richcontent->html;


echo  $itrate1->richcontent->html->body->asXML();
 print_r((string) $itrate1->richcontent->html->body->asXML());

Ниже приведена рекурсивная функция, которая преобразует все дочерние элементы в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top