Просто была очень похожая проблема и решена следующим образом. Основная идея состояла в том, чтобы загрузить файл в строку, заменить все плохие объекты на что-то вроде «[[entity]] Oslash;» и выполнить обратную замену перед отображением какого-либо узла xml.
function readXML($filename){
$xml_string = implode("", file($filename));
$xml_string = str_replace("&", "[[entity]]", $xml_string);
return simplexml_load_string($xml_string);
}
function xml2str($xml){
$str = str_replace("[[entity]]", "&", (string)$xml);
$str = iconv("UTF-8", "WINDOWS-1251", $str);
return $str;
}
$xml = readXML($filename);
echo xml2str($xml->forenames);
iconv ("UTF-8", "WINDOWS-1251", $ str), так как у меня есть кодировка "WINDOWS-1251" на моей странице