Peringatan 'xmlParseEntityRef: no name' saat memuat xml ke dalam file php

91

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)

Rajat Gupta
sumber
XML tidak valid. Anda mungkin tidak dapat memuatnya sama sekali. Kesalahan dapat diredam dengan menambahkan @di depan simplexml_load_fileatau dengan menambahkan bendera, lihat halaman manual dari simplexml_load_fileuntuk informasi lebih lanjut dan tolong hapus pertanyaan Anda, ini adalah duplikat.
hakre
Saya dapat melihat bahwa jawaban saya mendapatkan cukup banyak perhatian, jika itu benar-benar solusinya: dapatkah Anda menandainya sebagai "jawaban yang benar"? Terima kasih.
ricricucit

Jawaban:

146

XML kemungkinan besar tidak valid.

Masalahnya bisa jadi "&"

$text=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $text);

akan menyingkirkan "&" dan menggantinya dengan versi kode HTML-nya ... cobalah.

ricricucit
sumber
2
Terima kasih. Anda menyelamatkan hari saya!
Saim
2
Praktik terbaik saat bekerja dengan XML adalah memastikan tidak ada karakter yang bertentangan dan Anda harus menggantinya sebelum parsin
Mr Megamind
2
terima kasih, poin utama dari pertanyaan ini adalah karena xml tidak valid
yussan
Sedikit tambahan, jika Anda ingin mengganti semua ampersand, tambahkan 'g' ke regex Anda. Solusi yang diperbarui akan terlihat seperti ini: $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes
81

Temukan ini di sini ...

Masalah: Pengurai XML mengembalikan kesalahan "xmlParseEntityRef: noname"

Penyebab: Ada tanda '&' (karakter ampersand) yang tersesat di suatu tempat dalam teks XML misalnya. beberapa teks & beberapa teks lagi

Larutan:

  • Solusi 1: Hapus ampersand.
  • Solusi 2: Enkode ampersand (yaitu mengganti &karakter dengan &amp;). Ingatlah untuk Decode saat membaca teks XML.
  • Solusi 3: Gunakan bagian CDATA (teks di dalam bagian CDATA akan diabaikan oleh parser.) Mis. <! [CDATA [beberapa teks & beberapa teks lainnya]]>

Catatan: '&' '<' '>' akan memberikan masalah jika tidak ditangani dengan benar.

King'ori Maina
sumber
Apakah kita tahu mengapa ini terjadi? Selain itu, apakah bagian CDATA masih akan diambil oleh browser yang akan membuat sebagian dari data ini? Saya memiliki beberapa tag HTML di dalam tag XML saya dan saya membutuhkannya untuk diberikan kepada pengguna akhir untuk alat pengeditan.
sulimmesh
11

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 &amp;.

Ufuk Özdemir
sumber
Adakah yang bisa menjelaskan mengapa ini tidak disukai? htmlspecialchars()adalah fungsi yang tepat untuk mengonversi &, ", <, >karakter dalam data elemen.
JacobRossDev
7
Jawaban ini mendapat suara negatif karena tidak berfungsi dengan baik dalam kasus ini. Menggunakan fungsi itu akan benar-benar merusak XML Anda dengan mengubah "<" menjadi "& lt;". Saya tidak mengetahui cara apa pun yang dapat Anda gunakan htmlspecialchars()dan tidak merusak XML. Saya mencoba beberapa flag dan XML saya masih rusak.
Alex Finnarn
1
Anda harus menggunakan htmlspecialcharskonten tag xml, bukan pada keseluruhan XML
gbalduzzi
7

Saya menggunakan versi gabungan:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))
Berkuasa 85
sumber
1
Yang ini bekerja dengan sempurna. Anda baru saja melewatkan braket kanan akhir
myh34d
7

MASALAH

  • Fungsi PHP simplexml_load_filememunculkan kesalahan penguraian parser error : xmlParseEntityRefsaat mencoba memuat file XML dari URL.

SEBAB

  • XML yang dikembalikan oleh URL bukan XML yang valid. Ini berisi &nilai, bukan &amp;. Ada kemungkinan besar ada kesalahan lain yang tidak terlihat jelas pada saat ini.

HAL DI LUAR KENDALI KAMI

  • Idealnya, kita harus memastikan bahwa XML yang valid dimasukkan ke dalam PHP simplexml_load_file fungsi , tetapi sepertinya kita tidak memiliki kendali atas bagaimana XML dibuat.
  • Juga tidak mungkin untuk memaksa simplexml_load_filememproses file XML yang tidak valid. Itu tidak memberi kita banyak pilihan, selain memperbaiki file XML itu sendiri.

SOLUSI YANG MUNGKIN

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.php

Setelah 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 &amp; Development for under developed nations">
      <invalid-data>Some other data containing &amp; 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);

PERINGATAN

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.

Kamal Soni
sumber
6

XML tidak valid.

<![CDATA[ 
{INVALID XML}
]]> 

CDATA harus dibungkus di sekitar semua karakter XML khusus, sesuai W3C

Edwin Daniels
sumber
3

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 .

Guillaume
sumber
1

Ini memecahkan masalah saya:

$description = strip_tags($value['Description']);
$description=preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', $description);
$description= preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $description);
$description=str_replace(' & ', ' &amp; ', html_entity_decode((htmlspecialchars_decode($description))));
Malki Mohamed
sumber
1

Jika Anda mendapatkan masalah ini dengan buka mulai, coba edit

catalog / controller / extension / feed / google_sitemap.php Untuk info lebih lanjut dan Bagaimana melakukannya lihat ini: xmlparseentityref-no-name-error

Akila Wickramasekara
sumber