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)


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.


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.


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


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))

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.


6

XML tidak valid.

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

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



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))));

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.