2010-12-10 68 views
1

J'ai un fichier XML qui contient des données d'arbre généalogique dans une structure imbriquée, et je veux l'analyser dans une liste imbriquée.Parse XML à une liste imbriquée avec PHP

J'ai le code suivant

<?php 
    $doc = new DOMDocument(); 
    $doc->load('armstrong.xml'); 
    echo $doc->saveXML(); 
?> 

qui charge dans le fichier XML suivant et l'imprime en l'état

<?xml version="1.0" encoding="UTF-8"?> 
<indi> 
    <id>id1</id> 
    <fn>Matt</fn> 
    <bday>1919</bday> 
    <dday>2000</dday> 
    <spouse>Evelyn Ross</spouse> 
    <family> 
     <indi> 
     <id>id2</id> 
     <fn>Jane</fn> 
     <bday></bday> 
     <dday></dday> 
     <spouse></spouse> 
     <family> 

     </family> 
    </indi> 
    <indi> 
     <id>id3</id> 
     <fn>Jason</fn> 
     <bday></bday> 
     <dday></dday> 
     <spouse></spouse> 
     <family> 

     </family> 
    </indi> 
    <indi> 
     <id>id4</id> 
     <fn>Samuel</fn> 
     <bday></bday> 
     <dday></dday> 
     <spouse></spouse> 
     <family> 
      <indi> 
       <id>id5</id> 
       <fn>John</fn> 
       <bday></bday> 
       <dday></dday> 
       <spouse></spouse> 
       <family> 

       </family> 
      </indi> 
      <indi> 
       <id>id6</id> 
       <fn>John</fn> 
       <bday></bday> 
       <dday></dday> 
       <spouse></spouse> 
       <family> 

       </family> 
      </indi> 
     </family> 
    </indi> 
</family> 

Cependant, je veux analyser dans le format suivant :

<ul> 
    <li> 
    <span class="vcard person" id="id1"> 
      <span class="edit fn">Matt</span> 
     <span class="edit bday">1956</span> 
     <span class="edit dday"></span> 
      <span class="edit spouse">Eunace Fulton</span> 
     </span> 
    <ul> ... List of Family ... </ul> 
    </li> 
</ul> 

Je suis assez nouveau pour PHP, donc si c'est un problème incroyablement simple, je m'excuse! J'apprécierais vraiment des idées.

EDIT

Je suis maintenant en utilisant la boucle récursive suivante mais toujours des problèmes

$doc = new DOMDocument(); 
    $doc->load('armstrong.xml'); 

    function outputIndi($indi) { 
     $i = new DOMDocument(); 
     $i = $indi; 

     echo '<li>'; 

     echo '<span class="edit fn">' . $indi->getElementsByTagName("fn") . '</span>'; // name not a real attribute, must access through DOM 
     echo '<span class="edit bday">' . $indi->getElementsByTagName("bday") . '</span>'; // ditto 
     // ... 

     echo '<ul>'; 
     foreach ($indi->getElementsByTagName("family") as $subIndi) { // again, family not a real attribute 
      outputIndi($subIndi); 
     } 
     echo '</ul>'; 

     echo '</li>'; 
    } 

    outputIndi($doc->documentRoot); 

    ?> 

Répondre

1

Voici votre code. Vous devrez ajouter le reste des attributs (jour, conjoint)

RECURSION!

function outputIndi($indi) { 
    echo '<li>'; 
    $id = $indi->getElementsByTagName('id')->item(0)->nodeValue; 
    echo '<span class="vcard person" id="' . $id . '">'; 

    $fn = $indi->getElementsByTagName('fn')->item(0)->nodeValue; 
    $bday = $indi->getElementsByTagName('bday')->item(0)->nodeValue; 

    echo '<span class="edit fn">' . $fn . '</span>'; 
    echo '<span class="edit bday">' . $bday . '</span>'; 
    // ... 

    echo '<ul>'; 
    $family = $indi->getElementsByTagName('family')->item(0)->childNodes; 
    foreach ($family as $subIndi) { 
     outputIndi($subIndi); 
    } 
    echo '</ul>'; 
    echo '</span>'; 
    echo '</li>'; 
} 

$doc = new DOMDocument(); 
$doc->load('armstrong.xml'); 

outputIndi($doc->documentElement); 

Vous voyez, il affiche toutes les informations sur un « indi », des boucles à travers chaque enfant de <family>, et se demande à ce sujet. Cela a-t-il du sens?

+0

Ouais je le pense, merci! Donc, est la valeur initiale que je passe à outputIndi() la variable $ doc que j'ai actuellement? Et quand vous dites nom, bday etc ne sont pas de vrais attributs, est-ce que cela signifie que votre code a besoin de moi pour faire quelque chose comme getElementsByTagName? –

+0

Pas tout à fait ... '$ doc-> documentRoot'. Et oui, c'est exactement ça, 'getElementsByTagName'. – Jonah

+0

Merci J'ai essayé et je reçois cette erreur Erreur fatale: Appel à une fonction membre getElementsByTagName() sur un non-objet dans /nfs/c05/h03/mnt/74985/domains/chris-armstrong.com/html/ gortin/index.php on line 115 –