2009-08-13 8 views
11

Cerco ed elabora file XML da altrove, e devo trasformarli in con alcuni XSLT. Nessun problema. Utilizzando PHP5 e la libreria DOM , tutto è semplicissimo. Ha funzionato bene, fino ad ora. Oggi, i funky caratteri erano nel file XML - citazioni "intelligenti" da Word, sembra uguale a . Comunque, DOMDocument-> caricare lamentato su di loro, dicendo che non erano UTF-8, e per specificare la codifica.Come dire a DOMDocument-> load() quale codifica voglio che usi?

Ecco, la codifica non è specificata in questi file XML. Se I aggiunge "encoding =" iso-8859-1 "" all'intestazione, funziona correttamente. Lo sfregamento è Non ho alcun controllo su questi file XML.

Leggere il file in una stringa, modificare la sua intestazione e la scrittura di nuovo fuori in un'altra posizione sembra essere la mia unica opzione, ma preferirei fare senza dover utilizzare copie temporanee dei file XML in tutti. c'è un modo per dire semplicemente al parser di analizzarli come se fossero iso-8859-1?

risposta

9

Funziona per voi?

$doc = new DOMDocument('1.0', 'iso-8859-1'); 
$doc->load($xmlPath); 

Edit: Poiché sembra che questo non funziona, cosa si potrebbe fare invece è simile al tuo metodo esistente, ma senza il file temporaneo. Leggere il file XML da sorgente usando solo le operazioni standard IO (file_get_contents() o qualcosa del genere), quindi eseguire qualsiasi cambiamenti alla codifica è necessario (o iconv()utf8_decode()) e quindi utilizzare loadXML()

$myXMLString = file_get_contents($xmlPath); 
$myXMLString = utf8_decode($myXMLString); 
$doc = new DOMDocument('1.0', 'iso-8859-1'); 
$doc->loadXML($myXMLString); 
+1

provato questo - non sembra per effettuare il documento caricato - dalla mia lettura, ho Sono abbastanza sicuro che la codifica venga resettata dalla chiamata load() – Loki

5

non ho trovato un modo per impostare la codifica predefinita (ancora) ma forse la modalità di recupero è fattibile in questo caso.
Quando libxml incontra un errore di codifica e nessuna codifica è stata impostata esplicitamente, passa da unicode/utf8 a latin1 e continua l'analisi del documento. Ma nel contesto parser la proprietà wellFormed è impostata su 0/falso. L'estensione DOM di PHP considera valido il documento se wellFormed è vero o l'attributo dell'oggetto DOMDocument recover è true.

<?php 
// german Umlaut ä in latin1 = 0xE4 
$xml = '<foo>'.chr(0xE4).'</foo>'; 

$doc = new DOMDocument; 
$b = $doc->loadxml($xml); 
echo 'with doc->recover=false(default) : ', ($b) ? 'success':'failed', "\n"; 

$doc = new DOMDocument; 
$doc->recover = true; 
$b = $doc->loadxml($xml); 
echo 'with doc->recover=true : ', ($b) ? 'success':'failed', "\n"; 

stampe

Warning: DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding ! 
Bytes: 0xE4 0x3C 0x2F 0x66 in Entity, line: 1 in test.php on line 6 
with doc->recover=false(default) : failed 

Warning: DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding ! 
Bytes: 0xE4 0x3C 0x2F 0x66 in Entity, line: 1 in test.php on line 11 
with doc->recover=true : success 

È ancora ottenere il messaggio di avviso (che può essere soppresso con @ $ doc-> load()) e sarà anche mostrare nella internal libxml errors (solo una volta quando il parser passa da utf8 a latin1). Il codice di errore per questo particolare errore sarà 9 (XML_ERR_INVALID_CHAR).

<?php 
$xml = sprintf('<foo> 
    <ae>%s</ae> 
    <oe>%s</oe> 
    & 
</foo>', chr(0xE4),chr(0xF6)); 

libxml_use_internal_errors(true); 
$doc = new DOMDocument; 
$doc->recover = true; 
libxml_clear_errors(); 
$b = $doc->loadxml($xml); 
$invalidCharFound = false; 
foreach(libxml_get_errors() as $error) { 
    if (9==$error->code && !$invalidCharFound) { 
     $invalidCharFound = true; 
     echo "found invalid char, possibly harmless\n"; 
    } 
    else { 
     echo "hm, that's probably more severe: ", $error->message, "\n"; 
    } 
} 
2

Il modo girarci intorno per specificare la codifica è nella dichiarazione XML all'inizio del file:

<?xml version="1.0" encoding="ISO-8859-1"?> 
+0

Questa è l'unica risposta corretta - vedi anche http://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-not-encoding-utf-8- correttamente – iquito

Problemi correlati