simplexmlelement simplexml_load_string new error ejemplo array php xml simplexml

php - simplexml_load_string - simplexmlelement()



Forzar un objeto SimpleXML a una cadena, independientemente del contexto (9)

Digamos que tengo un XML como este

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

El siguiente código hace lo que quiero porque arroja el título como una cadena

$xml = simplexml_load_string($xmlstring); echo $xml->channel->item->title;

Aquí está mi problema. El código siguiente no trata el título como una cadena en ese contexto, así que termino con un objeto SimpleXML en la matriz en lugar de una cadena.

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

He estado trabajando alrededor de esto así

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

pero eso parece feo

¿Cuál es la mejor manera de forzar un objeto SimpleXML a una cadena, independientemente del contexto?


Existe el método nativo SimpleXML SimpleXMLElement::asXML Según el parámetro, escribe SimpleXMLElement en un archivo xml 1.0 o simplemente en una cadena:

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


La respuesta aceptada en realidad devuelve una matriz que contiene una cadena, que no es exactamente lo que solicitó OP (una cadena). Para expandir esa respuesta, use:

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

Lo cual devuelve el único elemento de la matriz, una cadena.


La siguiente es una función recursiva que convertirá todos los elementos de un solo hijo en una 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


No estoy seguro de si cambiaron la visibilidad del método __toString() desde que se escribió la respuesta aceptada, pero en este momento me funciona bien:

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

SALIDA:

string(15) "This is title 1"


Otra forma fea de hacerlo:

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

Funciona, pero no es bonito.


Para obtener datos XML en una matriz php, haz esto:

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

Para tener un niño, simplemente haz esto:

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

Puede expandir $ xml-> a través de cada nivel hasta que obtenga lo que desea. También puede poner todos los nodos en una matriz sin los niveles o casi de cualquier otra forma que desee.


Pruebe strval ($ xml-> channel-> item-> title)


Puedes usar la función de PHP

strval();

Esta función devuelve los valores de cadena del parámetro que se le pasa.


Typecast el SimpleXMLObject a una cadena:

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

El código anterior llama internamente a __toString() en SimpleXMLObject. Este método no está disponible públicamente, ya que interfiere con el esquema de asignación de SimpleXMLObject, pero aún se puede invocar de la manera anterior.