xml'yi bir php dosyasına yüklerken 'xmlParseEntityRef: isim yok' uyarıları


91

Php kullanarak bir xml okuyorum simplexml_load_file. Ancak xml'yi yüklemeye çalışırken bir uyarı listesi görüntüler

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

Bu uyarıları kaldırmak için nasıl düzeltme yapabilirim?

(XML url'den üretildi http://..../index.php/site/projectsve test.php'deki bir değişkene yüklendi. İndex.php'ye yazma yetkim yok)


XML geçersiz. Hiç yükleyemeyebilirsiniz. Hatalar @önüne simplexml_load_filebir bayrak ekleyerek veya bir bayrak ekleyerek bastırılabilir , simplexml_load_filedaha fazla bilgi için kılavuz sayfasına bakın ve lütfen sorunuzu silin, mükerrerdir.
hakre

Cevabımın oldukça fazla dikkat çektiğini görebiliyorum, eğer gerçekten çözüm buysa: lütfen "doğru cevap" olarak işaretleyebilir misiniz? Teşekkürler.
ricucit

Yanıtlar:


146

XML büyük olasılıkla geçersizdir.

Sorun "&" olabilir

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

"&" işaretini kaldıracak ve onun HTML kodu sürümüyle değiştirecek ... bir deneyin.


2
Teşekkür ederim. Günümü kurtardın!
Saim

2
XML ile çalışırken en iyi uygulama, çakışan karakter olmadığından emin olmaktır ve bunları parsin'den önce değiştirmelisiniz
Mr Megamind

2
teşekkürler, bu sorunun ana noktası
xml'nin

Küçük bir ekleme, eğer tüm ve işaretlerini değiştirmek istiyorsanız, normal ifadenize 'g' ekleyin. Güncellenen çözüm şöyle görünecektir: $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes

81

Bunu burada buldum ...

Sorun: Bir XML ayrıştırıcısı "xmlParseEntityRef: noname" hatasını döndürüyor

Neden: XML metninin herhangi bir yerinde başıboş '&' (ve işareti) vardır, örn. biraz metin ve biraz daha metin

Çözüm:

  • Çözüm 1: Ve işaretini kaldırın.
  • Çözüm 2: Ve işaretini kodlayın ( &karakteri ile değiştirin &amp;). XML metnini okurken Kod Çözmeyi unutmayın.
  • Çözüm 3: CDATA bölümlerini kullanın (bir CDATA bölümündeki metin ayrıştırıcı tarafından göz ardı edilecektir.) Örn. <! [CDATA [biraz metin ve biraz daha fazla metin]]>

Not: '&' '<' '>' doğru şekilde kullanılmazsa sorun yaratacaktır.


Bunun neden olduğunu biliyor muyuz? Ayrıca, bu verilerin bir kısmını oluşturacak bir tarayıcı tarafından bir CDATA bölümü hala alınacak mı? XML etiketlerimin içinde bazı HTML etiketlerim var ve bunların bir düzenleme aracı için son kullanıcıya işlenmeleri gerekiyor.
sulimmesh

11

Önce şu işlevi kullanarak HTML'yi temizlemeyi deneyin:

$html = htmlspecialchars($html);

Özel karakterler genellikle HTML'de farklı şekilde temsil edilir ve derleyici için kafa karıştırıcı olabilir. Gibi &olur &amp;.


Birisi bunun neden reddedildiğini açıklayabilir mi? eleman verilerindeki karakterleri htmlspecialchars()dönüştürmek için kesin işlevdir &, ", <, >.
JacobRossDev

7
Bu yanıt, bu durumda iyi sonuç vermediği için olumsuz oylanmıştır. Bu işlevi kullanmak XML'inizi "<" karakterini "& lt;" dönüştürerek tamamen bozacaktır. htmlspecialchars()XML'i kullanıp kıramayacağınızın herhangi bir yolunu bilmiyorum . Birkaç bayrak denedim ve XML'im hala bozuktu.
Alex Finnarn

1
htmlspecialcharsXML etiketinin tamamında değil, XML etiketinin içeriğinde kullanmalısınız
gbalduzzi

7

Birleşik bir versiyon kullanıyorum:

strip_tags(preg_replace("/&(?!#?[a-z0-9]+;)/", "&amp;",$textorhtml))

1
Bu mükemmel çalışıyor.
Sondaki

7

SORUN

  • PHP işlevi XML dosyasını bir URL'den yüklemeye çalışırken simplexml_load_fileayrıştırma hatası parser error : xmlParseEntityRefveriyor.

SEBEP OLMAK

  • URL tarafından döndürülen XML, geçerli bir XML değil. Yerine &değer içerir &amp;. Bu noktada aşikar olmayan başka hataların olması oldukça olasıdır.

KONTROLÜMÜZDEKİ ŞEYLER

  • İdeal olarak, geçerli bir XML'in PHP simplexml_load_fileişlevine beslendiğinden emin olmalıyız , ancak XML'in nasıl oluşturulacağı üzerinde herhangi bir kontrolümüz yok gibi görünüyor.
  • simplexml_load_fileGeçersiz bir XML dosyasını işlemeye zorlamak da mümkün değildir . XML dosyasını düzeltmek dışında bize pek çok seçenek bırakmaz.

OLASI ÇÖZÜM

Geçersiz XML'i Geçerli XML'e Dönüştür. Kullanılarak yapılabilir PHP tidy extension. Daha fazla talimat http://php.net/manual/en/book.tidy.php adresinde bulunabilir.

Uzantının var olduğundan veya yüklendiğinden emin olduktan sonra lütfen aşağıdakileri yapın.

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

DİKKAT

Geliştirici, tidy'yi kullandıktan sonra herhangi bir olumsuz yan etki olmadığını görmek için geçersiz XML'i geçerli bir XML ile (tidy tarafından oluşturulan) karşılaştırmaya çalışmalıdır. Tidy, bunu doğru yapmak konusunda son derece iyi bir iş çıkarır, ancak onu görsel olarak görmek ve% 100 emin olmak asla acı vermez. Bizim durumumuzda, $ xml ile $ tidy'yi karşılaştırmak kadar basit olmalıdır.




1

Bu benim sorunumu çöz:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.