Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML
XML Forum d'entraide sur XML avec PHP. Exemples : SimpleXML, OpenXML... Avant de poster -> FAQ XML, Cours XML et Sources XML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/07/2007, 20h01   #1
Invité de passage
 
Inscription : février 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 16
Points : 2
Points : 2
Par défaut [EXPAT] Balise fermante

Bonjour,

je débute en php et j'aimerais parser un fichier xml afin d'insérer son contenu dans une BDD.
Malheureusement je me suis heurté à un problème dont je n ai trouvé la solution nulle part.
Je parse le fichier XML disponible par une url bien précise, je le parcours , je mets les infos dans un tableau, jusque là tout se passe bien , mais au moment d'arriver à une balise de type :

<row typeID="3436" skillpoints="250" level="1" />

il m'appelle la fonction de balise fermante "function endElement($parser, $name)" donc je ne peux pas accéder aux attributs de cette balise

Voila le code en question (il est pas tres propre , mais je débute ^^)

Ha et je tourne en php4

Merci d'avance !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
<?
 
 
$fp = fopen("http://api.eve-online.com/char/CharacterSheet.xml.aspx?characterID=701567533&userid=2128249&apikey=UDV5n0UMpIvta0ghPgO5hKew3gwnxSyTvI3EIOXDSf3mVBHwpxZFeG3fxQzT2iLW","r");
$xml_parser=xml_parser_create();
$perso=array();
 
 
// Définitions des fcts utilisées lors de la présence d'un élément ( 2 fcts , open et close) ou d'une donnée (data)
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
 
function startElement($parser, $name, $attrs)
{
global $perso;
global $position;
 
$position = $name;
 
}
 
function characterData($parser, $data)
{
 
global $position;
global $perso;
 
if($position =="CORPORATIONNAME")
{
if(!($data=="\n")) $perso["CORPO"] = $data;
 
}
if($position =="NAME" || $position =="RACE" ||$position =="BLOODLINE" ||$position =="GENDER" ||$position =="BALANCE" || $position =="INTELLIGENCE" || $position =="MEMORY" || $position =="CHARISMA" || $position =="PERCEPTION" || $position =="WILLPOWER" )
{
 
if(!($data=="\n")) $perso[$position] = $data;
 }
 
 
 
}
 
function endElement($parser, $name)
{
 echo $name.'<br>';
}
 
 
if ($fp)
{
 
 
while ($data = str_replace("\n","",fread($fp, 4096)))
{
 if ( !xml_parse($xml_parser, $data, feof($fp)) )
 {
  $err=1;
  break;
 }
 
}
 xml_parser_free($xml_parser);
 
echo 'Infos perso<br>';
echo 'Name : '.$perso["NAME"];
echo '<br>';
echo 'Race : '.$perso["RACE"];
echo '<br>';
echo 'Bloodline : '.$perso["BLOODLINE"];
echo '<br>';
echo 'Gender : '.$perso["GENDER"];
echo '<br>';
echo 'Corpo : '.$perso["CORPO"];
echo '<u><br> Attributs : <br></u>';
echo 'Intelligence : '.$perso["INTELLIGENCE"];
}
 
?>
fmichael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 20h12   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
je viens d'essayer ton code et il fonctionne très bien
tu as les informations que tu cherches dans la variable "$attrs" de la fonction "startElement"
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 20h34   #3
Invité de passage
 
Inscription : février 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 16
Points : 2
Points : 2
Oui j arrive a récuperer les attributs d'une balise ouvrante grâce à startElement ,comme celle ci par exemple :
<rowset name="skills" key="typeID" columns="typeID,skillpoints,level,unpublished">

mais dans le cas d'une balise comme ca ( ouvrante/fermante ? ):
<row typeID="3436" skillpoints="250" level="1" />

Il m'appelle la fonction endElement($parser, $name) avec laquelle je n'ai pas accès aux attributs

J'espere que c est plus clair , désolé ^^

EDIT : pour le vérifier j'ai placé un echo $name dans la fonction startElement , et la balise ROW n y apparait pas, par contre qd je fais un echo $name dans endElement , elle y apparait
fmichael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 21h07   #4
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
tu as peut-être une version d'expat avec un bug
essaye ça
Code :
1
2
3
4
5
6
7
8
9
10
11
12
function startElement($parser, $name, $attrs)
{
	global $perso;
	global $position;
 
	$position = $name;
 
	echo "Ouverture : $name<br/>";
	echo '<pre>';
	print_r($attrs);
	echo '</pre>';
}
j'ai testé avec un fichier à la place de l'URL avec le contenu suivant :
Code XML :
1
2
3
4
5
6
<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="1">
	<rowset name="skills" key="typeID" columns="typeID,skillpoints,level,unpublished">
		<row typeID="3436" skillpoints="250" level="1"/>
	</rowset>
</eveapi>
et j'obtiens ce résultat :
Code x :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ouverture : EVEAPI

Array
(
    [VERSION] => 1
)

Ouverture : ROWSET

Array
(
    [NAME] => skills
    [KEY] => typeID
    [COLUMNS] => typeID,skillpoints,level,unpublished
)

Ouverture : ROW

Array
(
    [TYPEID] => 3436
    [SKILLPOINTS] => 250
    [LEVEL] => 1
)

Fermeture : ROW
Fermeture : ROWSET
Fermeture : EVEAPI
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 23h19   #5
Invité de passage
 
Inscription : février 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 16
Points : 2
Points : 2
ha ben apres relancé easyphp ca marche avec ta méthode

merci pour le coup de main
fmichael est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h32.


 
 
 
 
Partenaires

Hébergement Web