2010-12-27 28 views
7

VER EDITS en la parte inferior para mostrar más EXACTA DE SALIDA DE ERRORESPHP - error de análisis SimpleXML

estoy analizar un poco grandes archivos XML (~ 15 MB) con PHP por primera vez usando SimpleXML. Los archivos son resultados de la búsqueda del vuelo por lo que tienen atributos largos (enlaces de vuelta en Kayak; ejemplo:
"/book/flightcode=1238917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052 & sid = 26-Vu01v7ilzhSAjPVLZ3Ul "

SimpleXML lanza este error al analizar:

"Entidad: línea 10: error del analizador: EntityRef: se esperaba ';' en" y luego;

" 38917408.NxJI6G.0.F.ORBITZAIR , ORBITZAIR.0.f36f1ea92513977249aa695112410052 & sid en " y luego;

"simplexml_load_string() [function.simplexml-load-string]:^en,"

y así sucesivamente para cada línea donde hay estas URL.

Encontré una mención de que SimpleXML no le gustaba los atributos largos en php.net sin solución. Prefiero simplemente usar y aprender SimpleXML por ahora y trabajar más allá de este error si hay una solución no janky, algo fácil.

¿Alguien tiene una solución? ¡Gracias por adelantado!

He intentado ingresar las primeras 13 líneas del XML pero solo muestra la información sin el XML así que ... Puedo hacerlo si me sirve de ayuda. No estoy seguro de si el uso de otro analizador/extensión reduciría la funcionalidad o la facilidad de uso, pero no dude en sugerir otro si no hay una solución (DOM o XMLReader es lo que estoy pensando, tal vez).

EDITS ABAJO PARA incluir menos ADULTERADO SALIDA DE ERROR:

http://dl.dropbox.com/u/10206237/stack_overflow_xml.xml

ERROR 1:

simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: Entity: line 10: parser error : EntityRef: expecting ';' in 

ERROR 2: (El XML Creo que está muy bien, ya que funciona con un script en Python usando DOM; lo estoy traduciendo a PHP porque no conozco Python). No sabía que la salida en el navegador sería diferente. . Gracias por ser paciente)

<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: 38917408.Pt8rW8.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052&amp;_sid_ in 

ERROR 3:

function.simplexml-load-string</a>]:                    ^in  

(todos esos espacios son de allí)

+7

no es el atributo "larga", que es el '' y '' en el atributo . No es una entidad xml adecuada. Todos los signos y símbolos literales deben estar codificados (irónicamente) como '&'; el error indica que está esperando ';' porque quiere que '' & sid' 'sea una entidad, es decir:' '&sid; ''. –

+1

La solución es pedirle a quien generó ese XML que arregle su código y que emita un archivo XML XML válido. –

+0

En el archivo real que dice: "& _sid_ = 15- El error fue la producción en mi navegador tengo claro nada de codificación – JohnAllen

Respuesta

12

Como mencionado en otras respuestas y comentarios, su código fuente XML es roto y se supone que los analizadores XML para rechazar de entrada válido. libxml tiene un modo de "recuperación" que te permite cargar este XML roto, pero perderías la parte "& sid", por lo que no sería de ayuda.

Si tienes suerte y te gusta tomar riesgos, se puede tratar de hacer que funcione de alguna manera por la clase-de-la fijación de la entrada. Puede utilizar un reemplazo de cadena para escapar de los signos y símbolos que parecen estar en la parte de consulta de una URL.

$xml = file_get_contents('broken.xml'); 
// replace '&' followed by a bunch of letters, numbers 
// and underscores and an equal sign with &amp; 
$xml = preg_replace('#&(?=[a-z_0-9]+=)#', '&amp;', $xml); 
$sxe = simplexml_load_string($xml); 

Esto es, por supuesto, nada más que un truco y la única forma válida de resolver su situación es preguntar a su proveedor XML para fijar su generador. Porque si genera XML roto, ¿quién sabe qué otros errores pasan desapercibidos?

+0

Cómo examinar si la entrada de XML analizado no es válida? La función SimpleXmlElement() no devuelve falso en caso de XML no válido. t? – scaryguy

+0

Si el XML no es válido, entonces está realmente jodido. Puede tratar de salvar datos utilizando la manipulación de cadenas (a diferencia de la manipulación de XML), pero la única manera segura de solucionar la situación es producir XML válido. –

3

Darryl tiene la respuesta correcta en cuanto a por qué esto está ocurriendo en su comentario encima. Una forma de corregir esto sería hacer un str_replace() para reemplazar todos los símbolos '&' con '& amp;' en el XML.De acuerdo con la PHP manual también se podría utilizar esta expresión regular para reemplazar los símbolos de unión con sus entidades:

$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&amp;'.substr('\\0',1))", 
0

Tal vez el archivo XML analizado puede ser demasiado grande para el analizador. Pero puede tratar de pasar LIBXML_PARSEHUGE como una opción, lo que ayudó en mi caso.

0

he tenido este problema con los archivos de 13MB y lo resolvió mediante la inclusión de LIBXML_PARSEHUGE parámetro:

$xml = new SimpleXMLElement($contents, LIBXML_PARSEHUGE); 

NOTA: el uso de ini_set a 1 GB aún no ha resolver mi problema, ya que los contenidos Analizada ocupados más que esto.

Un enfoque más radical está utilizando otras bibliotecas en STREAM no por la carga todo el archivo (analizador SAX frente DOM parser), al igual que XML Streamer