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;
Este es mi problema. El siguiente código no trata el título como una cadena en ese contexto, por lo 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?
Respuestas:
Escriba el objeto SimpleXMLO en una cadena:
$foo = array( (string) $xml->channel->item->title );
El código anterior llama internamente
__toString()
al SimpleXMLObject. Este método no está disponible públicamente, ya que interfiere con el esquema de mapeo del SimpleXMLObject, pero aún se puede invocar de la manera anterior.fuente
substr
et al funcionan. Sin embargo, es más seguro realizar la transmisión lo antes posible, para que sepa que todas las funciones verán los datos que esperan.Puedes usar la función PHP
strval();
Esta función devuelve los valores de cadena del parámetro que se le ha pasado.
fuente
__toString()
implementado y sobre todo en este caso de preguntas en concreto, funciona muy bien con objetos de tipoSimpleXMLElement
. Puede compararlo con elstring
elenco en la respuesta aceptada.strval()
es una función de devolución de llamada práctico a menudo en conjunción conarray_map()
yiterator_to_array($simpleXMLElement, false)
oSimpleXMLElement::xpath()
.Existe el método SimpleXML nativo 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
fuente
Otra forma fea de hacerlo:
$foo = array( $xml->channel->item->title."" );
Funciona, pero no es bonito.
fuente
La respuesta aceptada en realidad devuelve una matriz que contiene una cadena, que no es exactamente lo que OP solicitó (una cadena). Para ampliar esa respuesta, use:
$foo = [ (string) $xml->channel->item->title ][0];
Que devuelve el elemento único de la matriz, una cadena.
fuente
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 tener el hijo de un niño, 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>";
Puede expandir $ xml-> a través de cada nivel hasta obtener lo que desea. También puede poner todos los nodos en una matriz sin los niveles o casi de cualquier otra forma que desee.
fuente
Pruebe strval ($ xml-> canal-> elemento-> título)
fuente
No estoy seguro de si cambiaron la visibilidad del
__toString()
método desde que se escribió la respuesta aceptada, pero en este momento funciona bien para mí:var_dump($xml->channel->item->title->__toString());
SALIDA:
string(15) "This is title 1"
fuente
Existe un método nativo 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());
fuente
Solo ponga el ''. antes de cualquier variable, se convertirá en cadena.
$ foo = array (''. $ xml-> canal-> elemento-> título);
fuente
La siguiente es una función recursiva que encasillará todos los elementos de un solo hijo a
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
fuente