2010-10-18 6 views
2

J'ai un fichier xml qui a des attributs/tags pour les niveaux de multilibres dans le flux, mais simplexml ne les affiche pas dans le vidage print_r.php - simplexml issue

Exemple:

<types tag1="1287368759" tag2="1287368759"> 
    <locations> 
     <segment prefix="http" lastchecked="0">www.google.com</segment> 
     <segment prefix="http" lastchecked="0">www.google.com</segment> 
     <segment prefix="http" lastchecked="0">www.google.com</segment> 
     <segment prefix="http" lastchecked="0">www.google.com</segment> 
     <segment prefix="http" lastchecked="0">www.google.com</segment> 
    </locations> 
</types> 

problème est les balises dans le <types> fonctionne très bien et montre dans la décharge xml, mais les balises dans chacun des segments ne sont pas là. De l'aide?

+0

aussi, quelqu'un sait comment obtenir des valeurs du tableau "@attributes" à l'intérieur du simplexml? – Joe

+0

simplexml m'a conduit fou, NUTS ... Je déteste vraiment le mélange de tableaux et d'objets. Je suis tellement plus heureux en utilisant Python et Beautiful Soup. Je ne sais pas si une bibliothèque comme Soup est disponible pour PHP ou pas, mais simplexml est tout sauf simple. Je déteste vraiment ça. – JAL

+0

N'utilisez pas print_r(). Sérieusement, ne le fais pas. @Alex JL: SimpleXML n'utilise pas de tableaux ou d'objets, alors oui, pas étonnant que vous ayez perdu la tête. SimpleXML prend en charge les nœuds accessibles en tant que propriétés d'objet, les attributs en tant qu'entrées de tableau associatives, les collections (nodelists) en tant que tableaux indexés numériquement à base de 0. Toutes ces propriétés sont magiques, print_r() vous en dira plus à ce sujet. –

Répondre

0

SimpleXML ne montrera pas les attributs si l'élément a des données normales, vous devez utiliser comme exemple ci-dessous:

<?php 
$xml = '<types tag1="1287368759" tag2="1287368759"> 
    <locations> 
     <segment prefix="http" lastchecked="0"><![CDATA[www.google.com]]></segment> 
     <segment prefix="http" lastchecked="0"><![CDATA[www.google.com]]></segment> 
     <segment prefix="http" lastchecked="0"><![CDATA[www.google.com]]></segment> 
     <segment prefix="http" lastchecked="0"><![CDATA[www.google.com]]></segment> 
     <segment prefix="http" lastchecked="0"><![CDATA[www.google.com]]></segment> 
    </locations> 
</types>'; 

$xml_data = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 

print_r($xml_data); 

foreach ($xml_data->locations->segment as $segment) { 
    print $segment['prefix'] . ' - ' . ((string) $segment) . "\n"; 
} 

Je ne sais pas pourquoi cela est, mais je trouve que cela fonctionne ,

Espérons que ça aide.

+0

cela fonctionne mais le problème est que j'ai besoin d'obtenir les valeurs des balises prefix/lastchecked, qui n'apparaissent pas dans le fichier print_r – Joe

+0

J'ai mis à jour l'exemple pour inclure l'affichage d'un attribut, mais comme Wrikken l'a déclaré dans son commentaire Il existe d'autres façons de le faire ... – NiGhTHawK

+0

En ce qui concerne les attributs, vous pouvez également regarder ici: http://stackoverflow.com/questions/1652128/accessing-attribute-from-simplexml – NiGhTHawK

2

SimpleXML ressemble plus à une ressource, donc var_dump ing/print_r ing ne donnera aucun résultat utilisable.

Un simple foreach($xml->types->segment->locations as $location) devrait fonctionner pour faire défiler vos emplacements et utiliser getAttributes() pour obtenir les attributs d'un nœud. Je suggère de regarder de plus près les exemples & fonctions dans le manuel (regardez les commentaires aussi), comme travailler avec SimpleXML peut être simple après que vous savez comment, vous avez besoin de quelques informations sur la façon de l'utiliser comme l'introspection habituelle n'est pas possible.

+0

les getattributes() ont aidé, merci! – Joe

+0

Vous pouvez également utiliser $ location ['prefix'] pour obtenir l'attribut prefix, etc. –