Pergunta

Eu tenho tentado analisar este feed. Se você clicar nesse link, notará que ele nem pode analisar corretamente no navegador.

De qualquer forma, meu serviço de hospedagem não me permite usar simplexml_load_file, então eu tenho usado o CURL para obtê -lo e depois carregar a string no DOM, assim:

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

Mas eu recebo erros ("DomDocument :: loadxml () [domdocument.loadxml]: entidade 'nbsp' não definido na entidade"), então tentei usar o simplexmlement sem sorte (ele mostra o mesmo erro "Erro do analisador: entidade 'nbsp' não definido ", etc ... por causa do html nesse elemento).

$xml = new SimpleXMLElement($rawXML);

Então, minha pergunta é: como faço para pular/ignorar/remover esse elemento para poder analisar o restante dos dados?


EDIT: Graças à MJV pela solução! ... Acabei de fazer isso (para outros que têm o mesmo problema)

$rawXML = str_replace('<description>','<description><![CDATA[',$rawXML);
$rawXML = str_replace('</description>',']]></description>',$rawXML);
Foi útil?

Solução

Pode ser necessário introduzir uma etapa de pré-parto que acrescente

<![CDATA[

após cadau003Cdescription> marcação
e adicione

]]>

antes de cada umu003C/description> marcação
Especificamente, (veja a resposta de Meder para o snippet php correspondente)

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

Dessa maneira, o conteúdo completo do elemento 'decrição' seria 'escapado', de modo que qualquer construção html (ou mesmo xhtml) encontrada neste elemento e suscetível de jogar a lógica de análise XML seria ignorada. Isso cuidaria do problema que você mencionaria, mas também muitos outros problemas comuns.

Outras dicas

Você provavelmente precisará manipular o código -fonte com algo como:

$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);
}

Antes de alimentá -lo com um analisador XML Afaik, eu adoraria recomendar de outra maneira, mas acho que essa é a única maneira.

Editar: Eu acho que você pode realmente substituir <description> com <description><![CDATA[ e assim por diante:

<?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);

Você precisaria fazer isso para cada elemento que contém dados de caracteres.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top