| |
|
Voir le sujet précédent :: Voir le sujet suivant
|
| Auteur |
Message |
| |
|
seabird WRInaute occasionnel

Inscrit le: 01 Déc 2003 Messages: 190
|
Posté le : Mer Juin 04, 2008 14:46 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
Bonjour,
J'ai un petit soucis lorsque je parse mon xml à chaque apparition de &.
Dès que le parseur rencontre la symbole & dans un tag , il s'arrête et passe au tag suivant
Par exemple ici j'affiche la valeur de title et link avec la profondeur correspondante. Tout se passe bien s'il n'y a pas de "&" dans le xml. Par contre dès qu'il y en a un , voila ce que j'obtiens.
J'ai le fichier test.xml suivant dans lequel j'ai mis amp; dans le titre 4-2 :
| Code: |
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<item>
<title>niveau4-1</title>
<link>Url-niveau4-1</link>
</item>
<item>
<title>niveau4-2 & essai </title>
<link>Url-niveau4-2</link>
<item>
<title>niveau5-1</title>
<link>Url-niveau5-1</link>
<item>
<title>niveau6-1</title>
<link>Url-niveau6-1</link>
</item>
</item>
<group>
<title>niveau5-2</title>
<link>Url-niveau5-2</link>
<propri>
<title>niveau6-2</title>
<link>Url-niveau6-2</link>
</propri>
</group>
</item>
</channel>
</rss>
|
Et quand je le parse , j'obtiens ceci:
| Code: |
Titre = niveau4-1---- profondeur = 4
Lien = Url-niveau4-1---- profondeur = 4
Titre = niveau4-2 ---- profondeur = 4
Titre = &---- profondeur = 4
Titre = essai ---- profondeur = 4
Lien = Url-niveau4-2---- profondeur = 4
Titre = niveau5-1---- profondeur = 5
Lien = Url-niveau5-1---- profondeur = 5
Titre = niveau6-1---- profondeur = 6
Lien = Url-niveau6-1---- profondeur = 6
Titre = niveau5-2---- profondeur = 5
Lien = Url-niveau5-2---- profondeur = 5
Titre = niveau6-2---- profondeur = 6
Lien = Url-niveau6-2---- profondeur = 6 |
On voit que le titre est coupé au niveau du &.
je pense qu'il doit y avoir un problème de codage quelque part.
Vous voyez comment m'en sortir . Pourquoi donc le parser fait comme si le & était la balise fermante ? |
|
| |
|
 |
jcaron WRInaute impliqué

Inscrit le: 13 Fév 2004 Messages: 496 Localisation: Paris
|
Posté le : Mer Juin 04, 2008 14:56 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
Si tu ne nous dis même pas ce que tu utilises pour parser ton XML, et comment, c'est sûr, on risque de t'aider énormément.
Jacques. |
|
| |
|
 |
seabird WRInaute occasionnel

Inscrit le: 01 Déc 2003 Messages: 190
|
Posté le : Mer Juin 04, 2008 15:06 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
Oui désolé voila
| Code: |
<?php
$profondeur = array();
$fichier = "essai.xml";
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
global $derniereBaliseRencontree;
$derniereBaliseRencontree = $nomBalise;
global $profondeur;
$profondeur[$parseur]++;
}
function fonctionBaliseFermante($parseur, $nomBalise)
{
global $derniereBaliseRencontree;
$derniereBaliseRencontree = "";
global $profondeur;
$profondeur[$parseur]--;
}
function fonctionTexte($parseur, $texte)
{
global $derniereBaliseRencontree;
global $profondeur;
if (($derniereBaliseRencontree=="TITLE")) {echo "Titre = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br>"; }
if (($derniereBaliseRencontree=="LINK")) {echo "Lien = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br><br>"; }
}
$parseurXML = xml_parser_create();
xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");
xml_set_character_data_handler($parseurXML, "fonctionTexte");
$fp = fopen($fichier, "r");
if (!$fp) die("Impossible d'ouvrir le fichier XML");
while ( $ligneXML = fgets($fp, 1024))
{
xml_parse($parseurXML, $ligneXML, feof($fp)) or
die("Erreur XML");
}
xml_parser_free($parseurXML);
fclose($fp);
?>
|
|
|
| |
|
 |
Bool WRInaute passionné

Inscrit le: 26 Fév 2004 Messages: 979 Localisation: Lyon
|
Posté le : Mer Juin 04, 2008 15:16 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
C'est le fonctionnement "normal" de xml_parser, et je pense que XMLReader en fait autant également. A toi de ne traiter les "data" qu'une fois la balise courante fermée.
SimpleXML quant à lui agrège peut-être de manière "automatique", je ne sais pas. |
|
| |
|
 |
seabird WRInaute occasionnel

Inscrit le: 01 Déc 2003 Messages: 190
|
Posté le : Mer Juin 04, 2008 15:33 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
Bon je vais y réfléchir...
Dernière édition par seabird le Mer Juin 04, 2008 16:11; édité 1 fois |
|
| |
|
 |
jcaron WRInaute impliqué

Inscrit le: 13 Fév 2004 Messages: 496 Localisation: Paris
|
Posté le : Mer Juin 04, 2008 15:34 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
Oui, c'est assez normal, la plupart des parsers XML ne garantissent pas qu'un bout de texte (entre deux tags) soit délivré "d'un seul coup". Le cas le plus classique ce sont les entités (& >...), mais ça pourrait arriver dans d'autre cas de figure (par exemple si tu fournis le XML par blocs).
Il convient toujours dans le handler de texte d'accumuler ce qui est reçu, et de ne faire le traitement que lorsque la balise est fermée.
Jacques.
[grilled] |
|
| |
|
 |
seabird WRInaute occasionnel

Inscrit le: 01 Déc 2003 Messages: 190
|
Posté le : Mer Juin 04, 2008 16:11 Sujet du message: parseur xml : contenu du tag coupé à chaque & |
|
|
Bon pour m'en sortir dans le parser j'ai utilisé str_replace , j'ai fait ça:
| Code: |
while ( $ligneXML = fgets($fp, 1024))
{
$ligneXML=str_replace("&","|",$ligneXML);
xml_parse($parseurXML, $ligneXML, feof($fp)) or
die("Erreur XML");
}
|
Ensuite lorsque j'affiche , je fais l'opération inverse:
| Code: |
if (($derniereBaliseRencontree=="TITLE")) {$texte=str_replace("|","&",$texte);echo "Titre = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br>"; }
if (($derniereBaliseRencontree=="LINK")) {$texte=str_replace("|","&",$texte);echo "Lien = ";echo "<b>$texte</b>";echo"---- profondeur = ";echo $profondeur[$parseur];echo"<br><br>"; }
|
ce n'est pas très élégant , mais bon ça marche.  |
|
| |
|
 |
| |
|
|
|
|
Autres sujets de discussion :
Définitions :
|
|