Forzare un oggetto SimpleXML in una stringa, indipendentemente dal contesto
Domanda
Diciamo che ho alcuni XML come questo
<channel>
<item>
<title>This is title 1</title>
</item>
</channel>
Il codice seguente fa quello che voglio in quanto genera il titolo come una stringa
$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;
Ecco il mio problema. Il codice seguente non tratta il titolo come una stringa in quel contesto, quindi finisco con un oggetto SimpleXML nella matrice anziché una stringa.
$foo = array( $xml->channel->item->title );
Ci ho lavorato in questo modo
$foo = array( sprintf("%s",$xml->channel->item->title) );
ma sembra brutto.
Qual è il modo migliore per forzare un oggetto SimpleXML in una stringa, indipendentemente dal contesto?
Soluzione
Digita il SimpleXMLObject in una stringa:
$foo = array( (string) $xml->channel->item->title );
Il codice precedente chiama internamente __toString ()
su SimpleXMLObject. Questo metodo non è disponibile pubblicamente, poiché interferisce con lo schema di mappatura di SimpleXMLObject, ma può comunque essere invocato nel modo sopra.
Altri suggerimenti
Puoi usare la funzione PHP
strval();
Questa funzione restituisce i valori stringa del parametro passato ad essa.
Esiste un metodo nativo SimpleXML SimpleXMLElement :: asXML A seconda del parametro scrive SimpleXMLElement nel file xml 1.0 o solo in una stringa:
$xml = new SimpleXMLElement($string);
$validfilename = '/temp/mylist.xml';
$xml->asXML($validfilename); // to a file
echo $xml->asXML(); // to a string
Un altro brutto modo di farlo:
$foo = array( $xml->channel->item->title."" );
Funziona, ma non è carino.
Per ottenere i dati XML in un array php, procedere come segue:
// 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>";
Per ottenere un bambino, basta fare questo:
$data = array();
foreach($xml->data->children() as $child)
{
$header[$child->getName()] = sprintf("%s", $child);
}
echo "<pre>\n";
print_r($data);
echo "</pre>";
Puoi espandere $ xml- > attraverso ogni livello fino a ottenere quello che vuoi È inoltre possibile inserire tutti i nodi in un array senza i livelli o praticamente in qualsiasi altro modo lo desideri.
La risposta accettata in realtà restituisce un array contenente una stringa, che non è esattamente ciò che OP ha richiesto (una stringa). Per espandere questa risposta, utilizzare:
$foo = [ (string) $xml->channel->item->title ][0];
Che restituisce il singolo elemento dell'array, una stringa.
Prova strval ($ xml- > channel- > item- > title)
Non sono sicuro che abbiano modificato la visibilità del metodo __toString ()
da quando è stata scritta la risposta accettata, ma al momento funziona bene per me:
var_dump($xml->channel->item->title->__toString());
Output:
string(15) "This is title 1"
Esiste il metodo SimpleXML nativo SimpleXMLElement :: asXML A seconda del parametro scrive SimpleXMLElement nel file 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());
Quella che segue è una funzione ricorsiva che inserirà tutti gli elementi figlio singolo in 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