2010-12-27 19 views
7

VEDI modifiche in FONDO PER MOSTRARE più accurato ERROR OUTPUTPHP - errore di analisi SimpleXML

sto analizzando un po 'di grandi file XML (~ 15 MB) con PHP per la prima volta usando SimpleXML. I file sono i risultati di ricerca dei voli in modo da avere gli attributi lunghi (link al Kayak; esempio:
"/book/flightcode=1238917408.NxJI6G.0.F.ORBITZAIR,ORBITZAIR.0.f36f1ea92513977249aa695112410052 & sid = 26-Vu01v7ilzhSAjPVLZ3Ul "

SimpleXML getta questo errore durante l'analisi:

"Entity: linea 10: errore del parser: EntityRef: in attesa ';' in" e poi;

" 38917408.NxJI6G.0.F.ORBITZAIR , ORBITZAIR.0.f36f1ea92513977249aa695112410052 & sid in " e poi;

"simplexml_load_string() [function.simplexml carico-stringa]:^a"

e così via per ogni linea dove ci sono questi URL.

Ho trovato una menzione di SimpleXML che non gradisce attributi lunghi su php.net senza soluzione. Preferisco semplicemente usare e imparare SimpleXML per ora e superare questo errore se c'è una soluzione non janky, un po 'facile.

Qualcuno ha una soluzione? Grazie in anticipo!

Ho tentato di inserire le prime 13 righe dell'XML ma esso restituisce solo le informazioni senza l'XML in modo .... Posso farlo se sarà d'aiuto. Non sono sicuro che l'uso di un altro parser/estensione ridurrebbe la funzionalità o la facilità d'uso, ma non esitate a suggerirne un altro se non c'è soluzione alternativa (DOM o XMLReader è ciò che sto pensando, forse).

EDITS qui sotto per COMPRENDONO MENO adulterato ERRORE DI USCITA:

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

ERRORE 1:

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

ERRORE 2: (L'XML penso che va bene perché funziona con uno script Python utilizzando DOM: lo sto traducendo in PHP perché non conosco Python). Non sapevo che l'output nel browser sarebbe stato diverso. . Grazie per la pazienza)

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

ERRORE 3:

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

(tutti quegli spazi sono in là)

+7

Non è l'attributo "lungo", è il ''e'' l'attributo . Non è un'entità xml corretta. Tutte le e commerciali letterali devono essere codificate (ironicamente) come '&' - l'errore indica che si aspetta ';' perché vuole che '' & sid' 'sia un'entità, ovvero:' '&sid;' '. –

+1

La soluzione è chiedere a chiunque abbia generato quell'XML di correggere il proprio codice e generare un plzkthx XML valido. –

+0

Nel file vero e proprio si dice: "& _Sid_ = 15- L'errore è stato di uscita dal mio browser ho chiaramente so nulla di codifica – JohnAllen

risposta

12

Come menzionate nelle altre risposte e commenti, la tua XML di origine è rotto e parser XML sono supposti a respingere input non valido. libxml ha una modalità di "recupero" che ti permetterebbe di caricare questo XML rotto, ma perdi la parte "& sid" quindi non sarebbe di aiuto.

Se sei fortunato e ti piace correre rischi, si può provare a fare in qualche modo funzionare per gentile-di-che fissa l'input. Puoi utilizzare alcune sostituzioni di stringhe per sfuggire agli e commerciali che sembrano parte della query di un 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); 

Questo è, naturalmente, nient'altro che un hack e l'unico buon modo per risolvere la situazione è quello di chiedere il vostro fornitore di XML per fissare la loro generatore. Perché se genera XML spezzato, chissà quali altri errori passeranno inosservati?

+0

Come esaminare se l'input XML analizzato non è valido? La funzione SimpleXmlElement() non restituisce false in caso di XML non valido? t? – scaryguy

+0

Se il codice XML non è valido, allora sei davvero un po 'fregato. Puoi provare a recuperare i dati usando la manipolazione delle stringhe (al contrario della manipolazione XML) ma l'unico modo sicuro per risolvere la situazione è produrre un XML valido. –

3

Darryl ha la risposta giusta per spiegare perché questo sta accadendo nel suo commento sopra. Un modo per risolvere il problema sarebbe quello di fare uno str_replace() per sostituire tutti i "e commerciali" & con "&"; nell'XML.Secondo il PHP manual si potrebbe anche usare questa espressione regolare per sostituire e commerciali con i loro entità:

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

forse il file XML analizzato potrebbe essere troppo grande per il parser. Ma puoi provare a passare LIBXML_PARSEHUGE come opzione - che ha aiutato nel mio caso.

0

Ho avuto questo problema con i file 13MB e risolto includendo LIBXML_PARSEHUGE parametro:

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

NOTA: usando ini_set a 1 GB non ha ancora risolvere il mio problema perché i contenuti analizzati occupate più di questo.

un approccio più radicale sta usando altre librerie per lo streaming piuttosto che CARICO intero file (SAX parser contro parser DOM), come XML Streamer