web-dev-qa-db-fra.com

Forcer un objet SimpleXML à une chaîne, quel que soit le contexte

Disons que j'ai du XML comme celui-ci

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

Le code ci-dessous fait ce que je veux car il affiche le titre sous forme de chaîne.

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

Voici mon problème. Le code ci-dessous ne traite pas le titre comme une chaîne dans ce contexte, je me retrouve donc avec un objet SimpleXML dans le tableau plutôt qu'une chaîne.

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

Je travaille comme ça

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

mais cela semble moche.

Quel est le meilleur moyen de forcer un objet SimpleXML à une chaîne, quel que soit le contexte?

72
Mark Biek

Typecast SimpleXMLObject en chaîne:

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

Le code ci-dessus appelle en interne __toString() sur SimpleXMLObject. Cette méthode n'est pas accessible au public, car elle interfère avec le schéma de mappage de SimpleXMLObject, mais elle peut toujours être invoquée de la manière ci-dessus.

140
Aron Rotteveel

Vous pouvez utiliser la fonction PHP

strval();

Cette fonction renvoie les valeurs de chaîne du paramètre qui lui est passé.

20
Zaje

Il existe une méthode native SimpleXML SimpleXMLElement :: asXML Selon le paramètre, il écrit SimpleXMLElement dans un fichier xml 1.0 ou dans une chaîne:

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

Une autre façon laide de le faire:

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

Cela fonctionne, mais ce n'est pas joli.

3
Mikepote

Pour obtenir des données XML dans un tableau php, procédez comme suit:

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

Pour obtenir un enfant, faites simplement ceci:

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

Vous pouvez développer $ xml-> à travers chaque niveau jusqu'à ce que vous obteniez ce que vous souhaitez.

2
Pete

La réponse acceptée renvoie en fait un tableau contenant une chaîne, qui n'est pas exactement ce que l'OP a demandé (une chaîne) . Pour développer cette réponse, utilisez:

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

Ce qui retourne le seul élément du tableau, une chaîne.

1
DJ Far

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

1
Ariel Ruiz

Il existe une méthode SimpleXML native SimpleXMLElement :: asXML En fonction du paramètre, elle écrit SimpleXMLElement dans un fichier XML 1.0, Oui 

$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());
0
BAVA SHIEK BAREETH

Je ne sais pas s'ils ont changé la visibilité de la méthode __toString() depuis que la réponse acceptée a été écrite, mais pour l'instant, cela fonctionne bien pour moi:

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

SORTIE:

string(15) "This is title 1"
0
billynoah