2009-08-13 2 views
11

Je recherche et traite des fichiers XML d'ailleurs, et ai besoin de les transformer avec des XSLT. Aucun problème. En utilisant PHP5 et la bibliothèque DOM , tout est facile. A travaillé bien, jusqu'à maintenant. Aujourd'hui, funky caractères étaient dans le fichier XML - "smart" citations de Word, il ressemble comme. Quoi qu'il en soit, DOMDocument-> charge se plaignait d'eux, en disant que ce n'était pas UTF-8, et de spécifier le codage. Et bien, le codage n'est pas spécifié dans ces fichiers XML. Si je ajoute dans 'encoding = "iso-8859-1"' à l'en-tête, cela fonctionne très bien. Le frottement est Je n'ai aucun contrôle sur ces fichiers XML.Comment indiquer à DOMDocument-> load() quel encodage je veux utiliser?

La lecture du fichier dans une chaîne, en modifiant son en-tête et l'écrire retour vers un autre endroit semble être ma seule option, mais je préfère faire sans avoir à utiliser des copies temporaires des fichiers XML à tout. existe-t-il un moyen de dire simplement à l'analyseur de les analyser comme s'ils étaient iso-8859-1?

Répondre

9

Est-ce que cela fonctionne pour vous?

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

Edit: Comme il semble que cela ne fonctionne pas, ce que vous pourriez faire à la place est similaire à votre méthode existante, mais sans le fichier temporaire. Lire le fichier XML de votre source en utilisant simplement des opérations standard IO (file_get_contents() ou quelque chose), puis effectuer tous les changements à l'encodage dont vous avez besoin (iconv() ou utf8_decode()), puis utiliser loadXML()

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

Essayé cela - il ne semble pas affecter le document chargé - de ma lecture, je Suis assez sûr que l'encodage est réinitialisé par l'appel load() – Loki

5

Je ne l'ai pas trouvé un moyen pour définir le codage par défaut (encore), mais peut-être le mode de récupération est possible dans ce cas.
Lorsque libxml rencontre une erreur de codage et qu'aucun codage n'a été explicitement défini, il passe d'unicode/utf8 à latin1 et poursuit l'analyse du document. Mais dans le contexte de l'analyseur, la propriété wellFormed est définie sur 0/false. L'extension DOM de PHP considère que le document est valide si wellFormed est vrai ou l'attribut de l'objet DOMDocument recover est vrai.

<?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"; 

impressions

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 

Vous obtenez toujours le message d'avertissement (qui peut être supprimé avec @ $ doc-> de charge()) et il affichera aussi dans le internal libxml errors (une seule fois lorsque le l'analyseur passe de utf8 à latin1). Le code d'erreur pour cette erreur particulière sera 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

La manière ony de spécifier l'encodage est dans la déclaration XML au début du fichier:

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

Ceci est la seule bonne réponse - voir aussi http://stackoverflow.com/questions/8218230/php-domdocument-loadhtml-not-encoding-utf-8- correctement – iquito

Questions connexes