Question

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 considère pas le titre comme une chaîne dans ce contexte. Je finis donc avec un objet SimpleXML dans le tableau au lieu d'une chaîne.

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

J'ai travaillé 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?

Était-ce utile?

La solution

Convertissez l'élément 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.

Autres conseils

Vous pouvez utiliser la fonction PHP

strval();

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

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

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

Une autre façon laide de le faire:

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

Cela fonctionne, mais ce n'est pas joli.

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 voulez Vous pouvez également mettre tous les nœuds dans un tableau sans les niveaux ou à peu près tout ce que vous voulez.

La réponse acceptée renvoie en réalité un tableau contenant une chaîne, ce 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];

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

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

Je ne sais pas s'ils ont changé la visibilité de la méthode __ toString () puisque la réponse acceptée a été écrite, mais cela fonctionne correctement pour moi à ce moment-là:

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

SORTIE:

string(15) "This is title 1"

Il existe une méthode SimpleXML native SimpleXMLElement :: asXML Selon le 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());

Ce qui suit est une fonction récursive qui convertit tous les éléments enfants simples en 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top