Pregunta

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, ya que genera el título como una cadena

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

Aquí está mi problema. El código a continuación 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 como este

$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?

¿Fue útil?

Solución

Escriba el objeto SimpleXMLO en una cadena:

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

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

Otros consejos

Puedes usar la función PHP

strval();

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

Hay un método nativo de SimpleXML SimpleXMLElement :: asXML Dependiendo del 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

Otra forma fea de hacerlo:

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

Funciona, pero no es bonito.

Para obtener datos XML en una matriz php, haga 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 obtener un hijo childs, simplemente haga esto:

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

Puedes expandir $ xml- > a través de cada nivel hasta que consigas lo que quieres También puede colocar todos los nodos en una matriz sin los niveles o de cualquier otra forma que quieras.

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

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

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

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

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

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

OUTPUT:

string(15) "This is title 1"

Hay un método nativo de SimpleXML SimpleXMLElement :: asXML Dependiendo del parámetro, escribe SimpleXMLElement en un archivo xml 1.0, Sí

$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());

La siguiente es una función recursiva que encasilla todos los elementos de un solo hijo a 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top