Pregunta

He estado tratando de analizar este alimento. Si hace clic en ese enlace, notará que ni siquiera puede analizarlo correctamente en el navegador.

De todos modos, mi servicio de alojamiento no me permitirá usar simplexml_load_file, por lo que he estado usando Curl para obtenerla y luego cargar la cadena en el DOM, así:

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

Pero recibo errores ("DomDocument :: LoadXml () [DomDocument.LoadXml]: Entity 'NBSP' no definido en entidad"), luego intenté usar simplexmlelement sin suerte (muestra el mismo error "error de analizador: entidad 'nbsp' no definido ", etc ... debido al HTML en ese elemento).

$xml = new SimpleXMLElement($rawXML);

Entonces, mi pregunta es, ¿cómo omito/ignoro/elimino ese elemento para poder analizar el resto de los datos?


Editar: ¡Gracias a MJV por la solución! ... Acabo de hacer esto (para otros que tienen el mismo problema)

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

Solución

Es posible que deba introducir un paso previo

<![CDATA[

después de cadau003Cdescription> etiqueta
y añadir

]]>

antes de cada unou003C/description> etiqueta
Específicamente, (ver la respuesta de Meder para el fragmento PHP correspondiente)

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

De esta manera, el contenido completo del elemento de 'descripción' se 'escapará', de modo que cualquier construcción HTML (o incluso XHTML) que se encuentre en este elemento y susceptible de arrojar la lógica de análisis XML se ignorara. Esto se encargaría del problema que mencione, pero también muchos otros problemas comunes.

Otros consejos

Probablemente necesite manipular el código fuente con 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 alimentarlo a un analizador XML AFAIK, me encantaría recomendar otra forma, pero creo que esta es la única forma.

Editar: creo que realmente puedes reemplazar <description> con <description><![CDATA[ Etcétera:

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

Debería hacer esto para cada elemento que contenga datos de caracteres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top