Форсирование объекта SimpleXML в строку независимо от контекста - PullRequest
72 голосов
/ 06 января 2009

Скажем, у меня есть такой 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 в строку независимо от контекста?

Ответы [ 10 ]

141 голосов
/ 06 января 2009

ТипВыберите SimpleXMLObject в строку:

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

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

20 голосов
/ 04 февраля 2009

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

strval();

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

9 голосов
/ 01 февраля 2013

Есть собственный метод 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
3 голосов
/ 13 августа 2012

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

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

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

1 голос
/ 04 июля 2017

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

1 голос
/ 07 сентября 2016

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

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

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

1 голос
/ 12 июля 2011

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

<code>// 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 "
";

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

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

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

0 голосов
/ 23 ноября 2018

Есть собственный метод 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());
0 голосов
/ 29 сентября 2017

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

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

ВЫВОД:

string(15) "This is title 1"
0 голосов
/ 17 июля 2017

Ниже приведена рекурсивная функция, которая преобразует все дочерние элементы в 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
...