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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top