Saya membaca xml di php menggunakan simplexml_load_file
. Namun saat mencoba memuat xml, daftar peringatan akan ditampilkan
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
Bagaimana cara memperbaiki untuk menghapus peringatan ini?
(XML dihasilkan dari url http://..../index.php/site/projects
& dimuat ke dalam variabel di test.php. Saya tidak menulis hak istimewa ke index.php)
@
di depansimplexml_load_file
atau dengan menambahkan bendera, lihat halaman manual darisimplexml_load_file
untuk informasi lebih lanjut dan tolong hapus pertanyaan Anda, ini adalah duplikat.Jawaban:
XML kemungkinan besar tidak valid.
Masalahnya bisa jadi "&"
$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $text);
akan menyingkirkan "&" dan menggantinya dengan versi kode HTML-nya ... cobalah.
sumber
$text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&', $text);
Temukan ini di sini ...
sumber
Coba bersihkan HTML terlebih dahulu menggunakan fungsi ini:
$html = htmlspecialchars($html);
Karakter khusus biasanya direpresentasikan secara berbeda dalam HTML dan mungkin membingungkan bagi kompilator. Seperti
&
menjadi&
.sumber
htmlspecialchars()
adalah fungsi yang tepat untuk mengonversi&, ", <, >
karakter dalam data elemen.htmlspecialchars()
dan tidak merusak XML. Saya mencoba beberapa flag dan XML saya masih rusak.htmlspecialchars
konten tag xml, bukan pada keseluruhan XMLSaya menggunakan versi gabungan:
strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&",$textorhtml))
sumber
simplexml_load_file
memunculkan kesalahan penguraianparser error : xmlParseEntityRef
saat mencoba memuat file XML dari URL.&
nilai, bukan&
. Ada kemungkinan besar ada kesalahan lain yang tidak terlihat jelas pada saat ini.simplexml_load_file
fungsi , tetapi sepertinya kita tidak memiliki kendali atas bagaimana XML dibuat.simplexml_load_file
memproses file XML yang tidak valid. Itu tidak memberi kita banyak pilihan, selain memperbaiki file XML itu sendiri.Ubah XML Tidak Valid menjadi XML Valid. Itu bisa dilakukan dengan menggunakan
PHP tidy extension
. Instruksi lebih lanjut dapat ditemukan dari http://php.net/manual/en/book.tidy.phpSetelah Anda yakin bahwa ekstensi tersebut ada atau diinstal, lakukan hal berikut.
/** * 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 & Development for under developed nations"> <invalid-data>Some other data containing & 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);
Pengembang sebaiknya mencoba membandingkan XML yang tidak valid dengan XML yang valid (dibuat dengan rapi), untuk melihat tidak ada efek samping yang merugikan setelah menggunakan rapi. Tidy melakukan pekerjaan yang sangat baik dalam melakukannya dengan benar, tetapi tidak ada salahnya untuk melihatnya secara visual dan 100% yakin. Dalam kasus kami, ini harus sesederhana membandingkan $ xml dengan $ rapi.
sumber
XML tidak valid.
CDATA harus dibungkus di sekitar semua karakter XML khusus, sesuai W3C
sumber
Ini dilakukan karena karakter bermain-main dengan data. Menggunakan
htmlentities($yourText)
berhasil untuk saya (saya memiliki kode html di dalam dokumen xml). Lihat http://uk3.php.net/htmlentities .sumber
Ini memecahkan masalah saya:
$description = strip_tags($value['Description']); $description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&', $description); $description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description); $description=str_replace(' & ', ' & ', html_entity_decode((htmlspecialchars_decode($description))));
sumber
Jika Anda mendapatkan masalah ini dengan buka mulai, coba edit
sumber