2009-09-04 10 views
1

Je suis l'analyse d'un fichier qui est configuré comme ceci:PHP Parsing cas de sensibilité

<blah-name name="Turkey"> 
<blah-city name="Test"/> 
<CAPS> 
    <type type="5"> 
    <type-two type="6"> 
</CAPS> 

Au sommet de mon dossier, je crée xmlobj $, comme ceci:

$xmlobj = simplexml_load_file("TEST.XML"); 

I « m puis insérer les valeurs dans une table en créant une classe qui prend toutes ces propriétés comme:

$record->{'blah-city'}->attributes()->name; 

tout quand j'évacue par soufflage essaie de creuser dans mon capit XML alized, cependant:

$record->{'CAPS'}->type->attributes()->type; 

Mon serveur souffle sur la ligne ci-dessus avec cette erreur: Fatal error: Call to a member function attributes() on a non-object et cite la ligne du fichier dans lequel la pièce au-dessus du code a été écrit.

J'ai essayé de faire un var_dump($record->{'CAPS'}); et cela montre que toute la structure existe correctement avec des valeurs intactes.

Est-ce que quelqu'un sait comment je pourrais corriger ce problème et aller de l'avant avec mon travail? Ce serait vivement apprécié!

+0

Pouvez-vous poster un vardump() de $ record? –

+0

Alors qu'est-ce que vous obtenez à partir d'un 'var_dump ($ record -> {' CAPS '} -> type);'? –

+0

objet (SimpleXMLElement) # 75 (2) {["type"] => objet (SimpleXMLElement) # 77 (1) {["@attributes"] => array (3) {["type"] => chaîne (2) "14" ["points"] => string (1) "1" ["bon"] => string (4) "vrai"}} ["player"] => objet (SimpleXMLElement) # 78 (1) {["@attributes"] => array (2) {["id"] => chaîne (6) "155685" ["global-id"] => chaîne (6) "399433"}}} Saison: 2008 –

Répondre

1

Avez-vous essayé de faire ceci:

$record->CAPS->type->attributes()->type; 

Juste sans { ''} CAPS autour d'elle, puisque ce n'est pas des thats pas nécessaire césure.

* Modifier selon votre nouveau commentaire ci-dessous:

Interesting result. When I tracked down {'type-two'}->attributes()->id, it displayed the proper value.

Dans ce cas, il est sans doute qu'il a un problème avec type-> attributs() -> Type. PHP peut avoir un problème de référence de mémoire interne à taper car il a le même nom. Essayez de changer

<type type="5"> 

à

<type-one type="5"> 

dans votre XML. Cela devrait régler votre problème. Vous pouvez alors y accéder comme ceci:

$record->{'CAPS'}->{'type-one'}->attributes()->type; 

De plus, avez-vous essayé?

$type_attributes = $record->{'CAPS'}->{'type-one'}->attributes(); 
$type_value = $type_attributes->type; 

Cela pourrait potentiellement résoudre votre problème. J'ai également trouvé this Stack Overflow link qui peut être utile.

+0

Ouais. Cela me donne toujours la même erreur. –

+0

Pouvez-vous me dire le résultat de $ record -> {'CAPS'} -> {'type-two'} -> attributes() -> type; S'il vous plaît? –

+0

Résultat intéressant. Lorsque j'ai traqué {'type-two'} -> attributes() -> id, il a affiché la bonne valeur. –

0

Le code XML ci-dessus n'est pas un balisage XML valide. Je ne sais pas comment votre dossier complet ressemble, mais en supposant que le fichier XML valide suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <blah-name name="Turkey" /> 
    <blah-city name="Test" /> 
    <CAPS> 
     <type type="5" /> 
     <type-two type="6" /> 
    </CAPS> 
</data> 

Le code suivant PHP fonctionne comme prévu:

$xmlobj = simplexml_load_file("TEST.XML"); 
$record = new stdClass(); 
foreach ($xmlobj as $key=>$value) { 
    $record->$key = $value; 
} 
var_dump($record->{'CAPS'}); 
+0

Comme vous pouvez le voir, il est capable d'accéder à certaines parties, et le var_dump montre parfaitement les éléments dont il a besoin. –

+0

Ouais - Je suis capable de descendre à tout, tant qu'il est en dehors de la XML –

+0

Est-ce qu'il lance une erreur sur chaque balise majuscule? Que se passe-t-il si vous le modifiez pour indiquer et que vous essayez d'y accéder? – friederbluemle