2008-09-25 9 views
0

Je suis actuellement confronté à un problème de retour d'un élément de mon fichier XML avec un seul guillemet. Cela entraîne xml_parse à le diviser en plusieurs morceaux, par exemple: Get Wired, You're Hired! Est alors entré comme 'Get Wired, You' étant un objet, la citation unique étant une seconde, et 'est embauché!' en troisièmeAnalyse XML avec des guillemets simples?

Ce que je veux faire est:

while($data = fread($fp, 4096)){ 
     if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) { 
      break; 
     } 
    } 

Mais qui maintient la rupture. Je peux exécuter un str_replace à la place de htmlentities et il fonctionne sans problème, mais ne le souhaite pas avec htmlentities.

Des idées?

Mise à jour: Selon la réponse JimmyJ ci-dessous, j'ai essayé la solution suivante sans chance (Pour votre information, il y a une réponse ou deux au-dessus du poste lié qui mettent à jour le code qui est lié directement):

function XMLEntities($string) 
    { 
     $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string); 
     return $string; 
    } 

    function _privateXMLEntities($num) 
    { 
    $chars = array(
     39 => ''', 
     128 => '€', 
     130 => '‚', 
     131 => 'ƒ', 
     132 => '„', 
     133 => '…', 
     134 => '†', 
     135 => '‡', 
     136 => 'ˆ', 
     137 => '‰', 
     138 => 'Š', 
     139 => '‹', 
     140 => 'Œ', 
     142 => 'Ž', 
     145 => '‘', 
     146 => '’', 
     147 => '“', 
     148 => '”', 
     149 => '•', 
     150 => '–', 
     151 => '—', 
     152 => '˜', 
     153 => '™', 
     154 => 'š', 
     155 => '›', 
     156 => 'œ', 
     158 => 'ž', 
     159 => 'Ÿ'); 
     $num = ord($num); 
     return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";"); 
    } 
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) { 
      break; 
     } 

Mise à jour: Selon la question de Tom ci-dessous, les guillemets magiques sont/étaient effectivement désactivés.

Solution: Ce que j'ai fini par faire pour résoudre le problème est le suivant:

Après avoir recueilli les données pour chaque article/post/etc individu, je stocke ces données à un tableau que j'utilise plus tard pour la sortie, effacez les variables locales utilisées lors de la collecte. J'ai ajouté dans une étape qui vérifie si les données sont déjà présentes, et si c'est le cas, je concatène à la fin, plutôt que de l'écraser.

Donc, si je me retrouve avec trois morceaux (comme ci-dessus, nous allons coller avec, je vais ensuite de faire

$x = 'Get Wired, You' 
$x = "'" 
$x = 're Hired!' 

Pour faire 'Get Wired, Embauché!:

.
$x = 'Get Wired, You' . "'" . 're Hired!' 

ce n'est pas la solution optimale, mais semble fonctionner

Répondre

1

Pourquoi utilisez-vous pas quelque chose comme simplexml_load_file analyser votre fichier facilement?

2

Je pense avoir des citations magiques permis peut gâcher l'analyse syntaxique xml parfois - est cette option activée ?. Vous pouvez désactiver cette exécution à l'aide

set_magic_quotes_runtime(0); 

Edit: cela peut ne pas être pertinent si la source n'est pas poster ou obtenir, mais je l'ai lu dans le manuel PHP que cela pourrait causer un comportement étrange de toute façon

Questions connexes