SimpleXML ve varlık ile sorun tanımlı olmamak

5 Cevap php

Bir XML dosyasını ayrıştırmak çalışıyorum, ama bunu yüklerken SimpleXML aşağıdaki uyarıyı yazdırır:

Uyarı: simplexml_load_file () [function.simplexml-load-file]: gpr_545.xml: 55: ayrıştırıcı hatası: İdarenin oslash 'on line 35 import.php tanımlı değil

Bu, satır:

<forenames>B&Oslash;IE</forenames><x> </x>

Bunu bir uyarı olarak, bunu görmezden olabilir, ama ben ne olduğunu anlamak istiyorum.

5 Cevap

(Bu karakter açıklar ne Ø gibi) Latin1 karakter HTML kodlaması XML çözümleyici kırık budur. Eğer veri kontrolü iseniz, XML stil karakter kodlamasını (Ø Sadece # 216 olması ve umulur kullanarak kaçmak gerekir ;)

HTML-kişiler ister & oslash XML varlıklar olarak aynı değildir. Here's a table XML kişilere HTML-varlıkları değiştirilmesi için.

Ben başka bir yazı için yorumlarınızı birinden anlayabileceğiniz gibi, bir varlık / ile sorun yaşıyorsanız. Sadece varlık adına Çıkışlardan - bu bile geçerli bir HTML-varlık ise benim Firefox karakterini göstermez, bilmiyorum. Ama çoğu kişiler ve onların karakter referans numarası için an other table bulundu. Senin yerine-tabloya ekleyerek deneyin ve güvenli olmalıdır. / 'nin referans numarası arada / olduğunu.

Bu bir kodlama sorunu olduğunu düşünüyorum. php, bu özel durumda SimpleXML, o etiketi fornames de var Danimarkalı O sevmez. Sen utf-8'de tüm dosya kodlamak ve bu tarafından etiketi kaçan sürümünü kaldırma deneyebilirsiniz. Aferwards Eğer SimpleXML içine tam kaçtı karakter ücretsiz dosyayı okuyabilir.

K

Sadece çok benzer bir sorun vardı ve şu şekilde çözüldü. Ana fikir, bir dizeye bir dosya yüklemek gibi bir şey bütün kötü varlıkları değiştirmek oldu "[[varlık]] oslash;" ve bazı xml düğümü görüntülemeden önce ters değişimi gerçekleştirmek.

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) gibi benim sayfasında "WINDOWS-1251" kodlama var

Bu çizgiyi kullanmayı deneyin:

<forenames><![CDATA[B&Oslash;IE]]></forenames><x> </x>

ve okumak this about CDATA