Pregunta

Estoy intentando analizar un archivo XML, pero al cargarlo, simpleXML imprime la siguiente advertencia:

Advertencia: simplexml_load_file () [function.simplexml-load-file]: gpr_545.xml: 55: error del analizador: Entidad 'Oslash' no definida en import.php en la línea 35

Esta es esa línea:

<forenames>B&Oslash;IE</forenames><x> </x>

Como es una advertencia, podría ignorarlo, pero me gustaría entender lo que está sucediendo.

¿Fue útil?

Solución

La codificación HTML de caracteres Latin1 (como Ø, lo que ese carácter describe) es lo que ha roto el analizador XML. Si tiene el control de los datos, debe escapar utilizando la codificación de caracteres de estilo XML (Ø simplemente resulta ser & amp; # 216;)

Otros consejos

Las entidades HTML como & amp; Oslash no son lo mismo que las entidades XML. Aquí hay una tabla para reemplazar entidades HTML a entidades XML.

Como puedo ver en uno de sus comentarios a otra publicación, está teniendo problemas con una entidad /. No sé si incluso esta es una entidad HTML válida, mi Firefox no mostrará el carácter, solo superará el nombre de la entidad. Pero encontré otra tabla para la mayoría de las entidades y su número de referencia de personaje. Intente agregarlos a su tabla de reemplazo y debería estar seguro. El número de referencia de / es / por cierto.

Creo que este es un problema de codificación. php, simplexml en este caso particular, no le gusta el danés O que tienes en esa etiqueta fornames. Podría intentar codificar todo el archivo en utf-8 y eliminar la versión escaneada de la etiqueta. A continuación, puede leer un archivo libre de caracteres totalmente escapado en simplexml.

K

Acabo de tener un problema muy similar y lo resolvió de la siguiente manera. La idea principal era cargar un archivo en una cadena, reemplazar todas las entidades defectuosas en algo como " [[entidad]] Oslash; " y realice el reemplazo inverso antes de mostrar algún nodo xml.

function readXML($filename){
    $xml_string = implode("", file($filename));
    $xml_string = str_replace("&", "[[entity]]", $xml_string);
    return simplexml_load_string($xml_string);
}
function xml2str($xml){
    $str = str_replace("[[entity]]", "&", (string)$xml);
    $str = iconv("UTF-8", "WINDOWS-1251", $str);
    return $str;
}
$xml = readXML($filename);
echo xml2str($xml->forenames);

iconv (" UTF-8 " ;, " WINDOWS-1251 " ;, $ str) como tengo " WINDOWS-1251 " codificación en mi página

Intenta usar esta línea:

<forenames><![CDATA[B&Oslash;IE]]></forenames><x> </x>

y lea esto sobre CDATA

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