2009-10-17 12 views
0

J'essaye d'analyser le XML ci-dessous pour que je finisse avec un tableau qui ressemble à l'échantillon inclus ... J'ai du mal à trouver comment obtenir les attributs à l'intérieur des balises pour afficher le chemin Je veux que ça ...PHP - Comment analyser ce fichier XML?

Le XML

<cust rid="999999" memberid="12345" lname="Doe" fname="John"> 
    <address memberid="12345" address1="1234 Mockingbird Lane" address2="" city="Oakland" state="CA" zip="91111" country="United States"/> 
    <phone memberid="12345" phonenumber="415.555.1212" countrycodeid="1" phonetype="Mobile"/> 
    <custcode memberid="12345" ccode="Silver" deleted=”1”/> 
    <custcode memberid="12345" ccode="Gold"/> 
</cust> 

array Je veux :: Notez les éléments du tableau ajoutés

Array 
    [cust] => Array 
     [rid] => 999999 
     [member_id] => 12345 
     [lname] => Doe 
     [fname] => John 
     [address] => Array 
      [0] => Array 
       [memberid] => 12345 
       [address1] => 1234 Mockingbird Lane 
       [address2] => 
       [city] => Oakland 
       [state] => CA 
       [zip] => 91111 
       [country] => United States 
     [phone] => Array 
      [0] => Array 
       [memberid] => 12345 
       [phonenumber] => 415.555.1212 
       [countrycodeid] => 1 
       [phonetype] => Mobile 
     [custcode] => Array 
      [0] => Array 
       [memberid] => 12345 
       [ccode] => Silver 
       [deleted] => 1 
      [1] => Array 
       [memberid] => 12345 
       [ccode] => Gold 

Répondre

3

Vous pouvez utiliser DOMDocument et ses champs/méthodes pour extraire les données. DOMDocument est également DOMNode a un champ appelé attributs qui est une carte de nom d'attribut et le noeud de valeur afin que vous puissiez obtenir le nom et la valeur de l'attribut (# 6-9). Chaque noeud a également firstChild et le prochain frère que vous pouvez naviguer à travers tous les sous-noeuds (# 12-26).

De cela, vous pouvez créer un tableau de données en conséquence. Voici le code que j'ai utilisé (avec un peu d'ajustements).

/*01*/ function Parse($XMLNode, $XMLData = null) { 
/*02*/  if ($XMLData == null) 
/*03*/  $XMLData = array(); 
/*04*/  
/*05*/  // Extract attribute as the array values 
/*06*/  if ($XMLNode->hasAttributes()) { 
/*07*/   foreach ($XMLNode->attributes as $AttrName => $AttrNode) 
/*08*/    $XMLData[$AttrName] = $AttrNode->nodeValue; 
/*09*/  } 
/*10*/  
/*11*/  // Loop all child 
/*12*/  $Child = $XMLNode->firstChild; 
/*13*/  while ($Child != null) { 
/*14*/   $Name = $Child->nodeName; 
/*15*/   if ($Name != "#text") { // Ignore the text 
/*16*/    $Nodes = $XMLData[$Name]; 
/*17*/    if ($Nodes == null) 
/*18*/     $Nodes = array(); // Array value from subnode is a nest array 
/*19*/    
/*21*/    $Nodes[] = Parse($Child); 
/*22*/    $XMLData[$Name] = $Nodes; 
/*23*/   } 
/*24*/   
/*25*/   $Child = $Child->nextSibling; 
/*26*/  } 
/*27*/  return $XMLData; 
/*28*/ } 
/*29*/ 
/*31*/ $XML = <<<EOF 
/*32*/ <cust rid="999999" memberid="12345" lname="Doe" fname="John"> 
/*33*/  <address memberid="12345" address1="1234 Mockingbird Lane" address2="" city="Oakland" state="CA" zip="91111" country="United States" /> 
/*34*/  <phone memberid="12345" phonenumber="415.555.1212" countrycodeid="1" phonetype="Mobile" /> 
/*35*/  <custcode memberid="12345" ccode="Silver" deleted="1" /> 
/*36*/  <custcode memberid="12345" ccode="Gold" /> 
/*37*/ </cust> 
/*38*/ EOF; 
/*39*/ 
/*41*/ $DOC = new DOMDocument(); 
/*42*/ $DOC->loadXML($XML); 
/*43*/ $Data = Parse($DOC->firstChild); 
/*44*/ 
/*45*/ print_r($Data); 

Le code ci-dessus renvoie le résultat comme prévu.

Espérons que cela aide.

1

Vous devriez essayer d'utiliser DOM. Il y a plusieurs fonctions dom2array dans les commentaires et si elles ne fonctionnent pas pour vous, elles peuvent vous donner d'autres idées.

1

Si vous utilisez PHP 5, utilisez SimpleXML. C'est beaucoup plus propre, plus facile à utiliser et plus rapide que DOM. Si vous utilisez PHP 4, vous devez utiliser DomXML et non Dom.

0

La réponse de NawaMan est probablement ce dont vous avez besoin, mais si vous voulez simplifier votre code DOM PHP en général, vous pouvez également considérer le phpQuery d'inspiration jQuery.

Questions connexes