2011-09-29 10 views
67

Sto leggendo un xml in php utilizzando simplexml_load_file. Tuttavia durante il tentativo di caricare il xml viene visualizzato un elenco di avvisiavvisi "xmlParseEntityRef: no name" durante il caricamento di xml in un file php

Warning: simplexml_load_file() [function.simplexml-load-file]: <project orderno="6" campaign_name="International Relief & Development" project in /home/bluecard1/public_html/test.php on line 3  
Warning: simplexml_load_file() [function.simplexml-load-file]:^in /home/bluecard1/public_html/test.php on line 3  
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3 

Warning: simplexml_load_file() [function.simplexml-load-file]: ional Relief & Development" project_id="313" client_name="International Relief & in /home/bluecard1/public_html/test.php on line 3  
Warning: simplexml_load_file() [function.simplexml-load-file]:^in /home/bluecard1/public_html/test.php on line 3  
Warning: simplexml_load_file() [function.simplexml-load-file]: http://..../index.php/site/projects/:15: parser error : xmlParseEntityRef: no name in /home/bluecard1/public_html/test.php on line 3 

Come faccio a rettificare per rimuovere questi avvertimenti?

(XML è generato da URL http://..../index.php/site/projects & caricato in una variabile nella test.php. Non ho i privilegi di scrittura per index.php)

+0

Il XML non è valido. Potresti non essere in grado di caricarlo affatto. Gli errori possono essere soppressi aggiungendo '@' davanti a 'simplexml_load_file' o aggiungendo un flag, vedi la pagina man di' simplexml_load_file' per maggiori informazioni e per favore elimina la tua domanda, è un duplicato. – hakre

+0

Vedo che la mia risposta sta ricevendo molta attenzione, se questa è effettivamente la soluzione: puoi contrassegnarla come "risposta corretta"? Grazie. – ricricucit

risposta

95

L'XML è molto probabilmente non valida.

Il problema potrebbe essere la "&"

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $text); 

sbarazzarsi del "&" e sostituirlo con la sua versione del codice HTML ... fare un tentativo.

+1

Grazie. Mi hai salvato la giornata! – Saim

+0

La best practice mentre si lavora con XML è assicurarsi che non ci siano caratteri in conflitto e dovresti sostituirli prima di parsin –

+0

grazie, il punto principale di questa domanda è perché xml non è valido – yussan

5

Il codice XML non è valido.

<![CDATA[ 
{INVALID XML} 
]]> 

CDATA deve essere avvolto intorno a tutti i caratteri XML speciali, come per W3C

54

trovato questo here ...

Problema: un parser XML restituisce l'errore “xmlParseEntityRef: noname”

Causa: C'è un randagio '& '(carattere e commerciale) da qualche parte nel testo XML es. un testo & altro testo

Soluzione:

  • Soluzione 1: Rimuovere la e commerciale.
  • Soluzione 2: codificare la e commerciale (ovvero sostituire il carattere '&' con '& amp;'). Ricordarsi di decodificare quando si legge il testo XML .
  • Soluzione 3: utilizzare le sezioni CDATA (il testo all'interno di una sezione CDATA verrà ignorato dal parser.) Es. ! < [CDATA [un certo testo & altro testo ]]>

Nota: ‘&’ ‘< ' '>‘saranno tutti dare problemi se non gestita correttamente.

+6

Questo mi ha salvato oggi. – Bwire

+0

Sappiamo perché questo è? Inoltre, una sezione CDATA verrà ancora rilevata da un browser che renderà alcuni di questi dati? Ho alcuni tag HTML all'interno dei miei tag XML e ho bisogno che vengano resi all'utente finale per uno strumento di modifica. – skeletalbassman

+0

@skeletalbassman Il motivo è parte della risposta. –

2

Questo è in atto a causa di personaggi che si scherzano con i dati. L'utilizzo di htmlentities($yourText) ha funzionato per me (avevo codice html all'interno del documento xml). Vedi http://uk3.php.net/htmlentities.

5

utilizzare una versione combinata:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml)) 
+1

Questo funziona perfettamente. Ti manca solo la parentesi quadra destra – myh34d

9

cercare di pulire il codice HTML prima di utilizzare questa funzione:

$html = htmlspecialchars($html); 

caratteri speciali sono di solito rappresentati in modo diverso in HTML e potrebbe essere fonte di confusione per il compilatore . Come & diventa &amp;.

+0

Qualcuno può spiegare perché questo è downvoted? 'htmlspecialchars()' è la funzione precisa per convertire '&,", <, > 'chars nei dati dell'elemento – jacobross85

+0

Ha funzionato perfettamente per me per ... –

+0

perché la spiegazione non è chiara e facilmente leggibile –

0

Questo risolve il mio problème:

$description = strip_tags($value['Description']); 
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $description); 
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description); 
$description=str_replace(' & ', ' &amp; ', html_entity_decode((htmlspecialchars_decode($description)))); 
4

PROBLEMA

  • funzione PHP simplexml_load_file sta gettando errore parser error : xmlParseEntityRef analisi durante il tentativo di caricare il file XML da un URL.

CAUSA

  • XML restituito dal URL non è un XML valido. Esso contiene & valore anziché &amp;. È del tutto possibile che ci siano altri errori che non sono ovvi in ​​questo momento.

COSE fuori dal nostro controllo

  • Idealmente, dovremmo fare in modo che un XML valido viene alimentata nel funzione PHP simplexml_load_file, ma sembra che non abbiamo alcuna controllo su come viene creato l'XML.
  • Non è inoltre possibile forzare simplexml_load_file per elaborare un file XML non valido . Non ci lascia molte opzioni, a parte lo che fissa il file XML stesso.

SOLUZIONE POSSIBILE

Converti XML non valido per XML valido. Può essere fatto usando PHP tidy extension. Ulteriori istruzioni possono essere trovate da http://php.net/manual/en/book.tidy.php

Una volta accertato che l'estensione esiste o è installata, eseguire le operazioni seguenti.

/** 
* As per the question asked, the URL is loaded into a variable first, 
* which we can assume to be $xml 
*/ 
$xml = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
<project orderno="6" campaign_name="International Relief & Development for under developed nations"> 
    <invalid-data>Some other data containing & in it</invalid-data> 
    <unclosed-tag> 
</project> 
XML; 

/** 
* Whenever we use tidy it is best to pass some configuration options 
* similar to $tidyConfig. In this particular case we are making sure that 
* tidy understands that our input and output is XML. 
*/ 
$tidyConfig = array (
    'indent' => true, 
    'input-xml' => true, 
    'output-xml' => true, 
    'wrap' => 200 
); 

/** 
* Now we can use tidy to parse the string and then repair it. 
*/ 
$tidy = new tidy; 
$tidy->parseString($xml, $tidyConfig, 'utf8'); 
$tidy->cleanRepair(); 

/** 
* If we try to output the repaired XML string by echoing $tidy it should look like. 

<?xml version="1.0" encoding="utf-8"?> 
<project orderno="6" campaign_name="International Relief &amp; Development for under developed nations"> 
     <invalid-data>Some other data containing &amp; in it</invalid-data> 
     <unclosed-tag></unclosed-tag> 
</project> 

* As you can see that & is now fixed in campaign_name attribute 
* and also with-in invalid-data element. You can also see that the 
* <unclosed-tag> which didn't had a close tag, has been fixed too. 
*/ 
echo $tidy; 

/** 
* Now when we try to use simplexml_load_string to load the clean XML. When we 
* try to print_r it should look something like below. 

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [orderno] => 6 
      [campaign_name] => International Relief & Development for under developed nations 
     ) 

    [invalid-data] => Some other data containing & in it 
    [unclosed-tag] => SimpleXMLElement Object 
     (
     ) 

) 

*/ 
$simpleXmlElement = simplexml_load_string($tidy); 
print_r($simpleXmlElement); 

ATTENZIONE

Lo sviluppatore dovrebbe cercare di confrontare il codice XML non valido con un XML valido (generato da ordine), per vedere non ci sono effetti collaterali dopo l'uso ordinato. Tidy fa un ottimo lavoro nel farlo correttamente, ma non fa mai male vederlo visivamente e per essere sicuro al 100%. Nel nostro caso dovrebbe essere semplice come confrontare $ xml con $ tidy.

0

Se hai trovato questa edizione con OpenCart provare modifica

catalogo/regolatore/estensione/feed/google_sitemap.php Per ulteriori informazioni e come fare riferimento a questo: xmlparseentityref-no-name-error

Problemi correlati