1 votes

Éléments PHP SimpleXML en Array

J'ai besoin d'envoyer une chaîne de HTML qui ressemble à contenu `quelquecode` `encore du code` encore plus de code

Cela irait dans un tableau comme suit :

$arra[] = "contenu";
$arra[] = "";
$arra[] = "

`

Mais je n'arrive pas à comprendre comment transformer ces données en un tableau.

Des conseils ?

` ``

2voto

Ryan Schumacher Points 1046

Tout simplement :

$lines = explode('> ', $xml);
foreach($lines as $line) {
  $arra[] = $line.'> ';
}

Cependant, ceci suppose que l'échantillon donné est une représentation exacte de votre XML (c'est-à-dire que vous utilisez > et < à l'intérieur des blocs de balises) et ne prend pas en compte les blocs CDATA ou les commentaires XML. http://www.w3.org/TR/REC-xml/#syntax

Autrement, je vous conseillerais de consulter les commentaires sur la page PHP.net : http://us.php.net/manual/en/function.xml-parse.php

2voto

Niels Bom Points 1955

Que cherchez-vous exactement à faire? Si vous nous donnez une vision plus large du problème que vous essayez de résoudre, nous pourrions peut-être vous donner une meilleure solution.

2voto

Alors vous voulez convertir cette structure de données en arbre :

  contenu 

    ducode 
    encoreducode 

   encore du code  

Dans une sorte de tableau plat :

Array
(
    [0] => "contenu"
    [1] => ""
    [2] => "ducode"
    [3] => "encoreducode"
    [4] => " encore du code  "
)

serait délicat. Il s'agit d'un problème classique en informatique qui n'a pas beaucoup de bonnes réponses. La structure arborescente fournit des informations sur les relations entre les entrées qu'un tableau ou une liste plat ne possède pas. Toute tentative de transformer l'arbre en une liste perdra ce contexte référentiel.

Vous pourriez soit exploser la chaîne de caractères et ensuite la parcourir en gardant une trace des éléments parents ou en les ignorant (voir tag2). Si je devais faire quelque chose avec le XML, je le placerais dans un SimpleXMLElement, qui produirait quelque chose comme ceci :

SimpleXMLElement Object
(
    [tag] => contenu
    [tag2] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [ref] => 333
                )
            [code] => Array
                (
                    [0] => ducode
                    [1] => encoreducode
                )
        )
    [tag3] =>  encore du code 
)

Avec cela, je peux le parcourir avec foreach et trouver la balise et son contenu. Je peux tester pour voir si le contenu est une chaîne de caractères ou des éléments enfants et le cas échéant les parcourir. Une fonction récursive résoudrait assez facilement ce problème. Le plus gros problème est de savoir comment représenter les données une fois aplaties.

Si vous les aplatissez dans l'array que j'ai fourni précédemment, les balises parent et enfant perdent toute relation implicite entre elles. Si ce n'est pas un problème, super. Écrivez la fonction récursive et vous avez terminé. Voici un pseudocode :

function walking($contenu)
  $out est le morceau de tableau qui est retourné
  foreach $contenu as $balise->$donnees
    si $valeur est un SimpleXMLElement
      fusionner $donnees[@attributes] en une chaîne $attributs
      ajouter <$balise $attributs> à la fin de $out
      vous devrez peut-être supprimer @attributes avant de récurer.
      récurser dans walking($donnees) et ajouter le tableau retourné à la fin de $out
    si $valeur est un tableau
      ajouter <$balise> à la fin de $out
      récurser dans  walking($donnees) et ajouter le tableau retourné à la fin de $out
    si $valeur est une chaîne de caractères
      ajouter <$balise>$donnees à la fin de $out
  après avoir bouclé à travers $contenu, retourner $out.

Cependant, si vous devez somehow keep those relationships intact, vous avez un peu un problème et devrez concevoir un système pour cela

0voto

Aif Points 4603

Si vous obtenez les données à partir d'un fichier, alors la fonction file() vous donnera un tableau avec une ligne par élément. Cela pourrait être la façon la plus simple!

0voto

netcrash Points 452
$xml = file_get_contents("../../xml/LL1234.xml");

$x = simplexml_load_string($xml);

function viewElements($x){
    $Arr = $GLOBALS['Arr'];
    if (count($x->attributes()) > 0 ){
        $attr='';
        foreach ($x->attributes() as $k => $v ){
                $attr .= " $k='".$v."'";
        }
    }

    $Arr[] = "<".$x->getName()." $attr>\n";
    if (count($x->children()) > 0 ){
        foreach ($x->children() as $k ){
            $GLOBALS['Arr'] = $Arr;
            viewElements($k);
            $Arr = $GLOBALS['Arr'];
        }
    }else{
        $Arr[] = $x[0];
    }

    $Arr[] = "</".$x->getName().">";
    $GLOBALS['Arr'] = $Arr;
}

foreach ($x->children() as $k ){
    viewElements($k);
}

foreach ($GLOBALS['Arr'] as $k ){
    print $k."<br>\n";
}
?>

Désolé pour le dérangement, grâce à tvanover, j'ai compris une meilleure façon de le faire, la solution est ci-dessous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X