Question

J'ai essayé d'analyser Ce flux. Si vous cliquez sur ce lien, vous remarquerez qu'il ne peut même pas l'analyser correctement dans le navigateur.

Quoi qu'il en soit, mon service d'hébergement ne me permet pas d'utiliser Simplexml_load_file, donc j'ai utilisé Curl pour l'obtenir puis charger la chaîne dans le DOM, comme ceci:

$dom = new DOMDocument;
$dom->loadXML($rawXML);
if (!$dom) {
 echo 'Error while parsing the document';
 exit;
}
$xml = simplexml_import_dom($dom);

Mais j'obtiens des erreurs ("DomDocument :: LoadXml () [domDocument.Loadxml]: Entity 'nbsp' non défini dans l'entité"), puis j'ai essayé d'utiliser SimplexMlelement sans chance (il montre la même erreur "Erreur de analyse: entité 'nbsp' non défini ", etc ... à cause du HTML dans cet élément).

$xml = new SimpleXMLElement($rawXML);

Ma question est donc de savoir comment sauter / ignorer / supprimer cet élément afin que je puisse analyser le reste des données?


Edit: Merci à MJV pour la solution! ... Je viens de faire ça (pour d'autres qui ont le même problème)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);
Était-ce utile?

La solution

Vous devrez peut-être introduire une étape pré-parse qui ajouterait

<![CDATA[

après chaqueu003Cdescription> étiquette
et ajouter

]]>

avant chacunu003C/description> étiquette
Plus précisément, (voir la réponse de Meder pour l'extrait PHP correspondant)

<description>blah <br />&nbsp; blah, blah...</description>
should become
<description><![CDATA[blah <br />&nbsp; blah, blah...]]></description>

De cette manière, le contenu complet de l'élément «décription» serait «échappé», de sorte que toute construction HTML (ou même XHTML) trouvée dans cet élément et susceptible de lancer la logique d'analyse XML serait ignorée. Cela prendrait en charge le problème que vous mentionnez, mais aussi de nombreux autres problèmes communs.

Autres conseils

Vous aurez probablement besoin de manipuler le code source avec quelque chose comme:

$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
if ( $xml ) {
    $xml = preg_replace( '/&nbsp/', '&amp;nbsp', $xml );
    $xml = new SimpleXMLElement($xml);
    var_dump($xml);
}

Avant de le nourrir à un analyseur XML Afaik, j'aimerais recommander une autre manière, mais je pense que c'est la seule façon.

Edit: je pense que vous pouvez réellement remplacer <description> avec <description><![CDATA[ et ainsi de suite:

<?php
$xml = @file_get_contents('http://www.wow-europe.com/realmstatus/index.xml');
$xml = preg_replace( '/<description>/', '<description><![CDATA[', $xml );
$xml = preg_replace( '/<\/description>/', ']]></description>', $xml );
$xml = new SimpleXMLElement($xml);
var_dump($xml);

Vous devez le faire pour chaque élément qui contient des données de caractère.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top