คำเตือน 'xmlParseEntityRef: no name' ขณะโหลด xml ลงในไฟล์ php


91

ฉันกำลังอ่าน xml ใน php โดยใช้simplexml_load_fileไฟล์. อย่างไรก็ตามในขณะที่พยายามโหลด xml จะแสดงรายการคำเตือน

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

ฉันจะแก้ไขเพื่อลบคำเตือนเหล่านี้ได้อย่างไร

(XML ถูกสร้างจาก url http://..../index.php/site/projects& โหลดลงในตัวแปรใน test.php ฉันไม่ได้เขียน priveleges ไปที่ index.php)


XML ไม่ถูกต้อง คุณอาจไม่สามารถโหลดได้เลย ข้อผิดพลาดสามารถระงับได้โดยการเพิ่ม@ข้างหน้าsimplexml_load_fileหรือโดยการเพิ่มค่าสถานะดูหน้าคู่มือsimplexml_load_fileสำหรับข้อมูลเพิ่มเติมและโปรดลบคำถามของคุณเนื่องจากเป็นคำถามที่ซ้ำกัน
hakre

ฉันเห็นได้ว่าคำตอบของฉันกำลังได้รับความสนใจเป็นอย่างมากหากนั่นเป็นวิธีแก้ปัญหาจริงคุณสามารถตั้งค่าสถานะเป็น "คำตอบที่ถูกต้อง" ได้หรือไม่ ขอบคุณ.
ricricucit

คำตอบ:


146

XML ส่วนใหญ่อาจไม่ถูกต้อง

ปัญหาอาจเกิดจาก "&"

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

จะกำจัด "&" และแทนที่ด้วยเวอร์ชันโค้ด HTML ... ลองดูสิ


2
ขอขอบคุณ. คุณช่วยวันของฉัน!
Saim

2
แนวทางปฏิบัติที่ดีที่สุดในขณะที่ทำงานกับ XML คือเพื่อให้แน่ใจว่าไม่มีอักขระที่ขัดแย้งกันและคุณควรแทนที่ก่อนพาร์ซิน
Mr Megamind

2
ขอบคุณประเด็นหลักของคำถามนี้เนื่องจาก xml ไม่ถูกต้อง
yussan

เพิ่มเพียงเล็กน้อยหากคุณต้องการแทนที่เครื่องหมายแอมเพอร์แซนด์ทั้งหมดให้ต่อท้าย 'g' กับนิพจน์ทั่วไปของคุณ โซลูชันที่อัปเดตจะมีลักษณะดังนี้ $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes

81

พบสิ่งนี้ที่นี่ ...

ปัญหา:ตัวแยกวิเคราะห์ XML ส่งกลับข้อผิดพลาด“ xmlParseEntityRef: noname”

สาเหตุ:มีอักขระ '&' (เครื่องหมายแอมเพอร์แซนด์) หลงทางอยู่ที่ไหนสักแห่งในข้อความ XML เช่น ข้อความบางส่วนและข้อความเพิ่มเติม

วิธีการแก้:

  • โซลูชันที่ 1: ลบเครื่องหมายแอมเพอร์แซนด์
  • โซลูชันที่ 2: เข้ารหัสเครื่องหมายแอมเพอร์แซนด์ (ซึ่งแทนที่&อักขระด้วย&amp;) อย่าลืมถอดรหัสเมื่ออ่านข้อความ XML
  • โซลูชันที่ 3: ใช้ส่วน CDATA (ข้อความภายในส่วน CDATA จะถูกละเว้นโดยตัววิเคราะห์) เช่น <! [CDATA [บางข้อความและข้อความเพิ่มเติม]]>

หมายเหตุ: '&' '<' '>' ทั้งหมดจะทำให้เกิดปัญหาหากไม่ได้รับการจัดการอย่างถูกต้อง


เรารู้หรือไม่ว่าทำไมถึงเป็นเช่นนี้? นอกจากนี้เบราว์เซอร์จะยังคงเลือกส่วน CDATA ที่จะแสดงข้อมูลนี้หรือไม่ ฉันมีแท็ก HTML อยู่ในแท็ก XML ของฉันและฉันต้องการให้แสดงผลแก่ผู้ใช้ปลายทางสำหรับเครื่องมือแก้ไข
sulimmesh

11

ลองล้าง HTML ก่อนโดยใช้ฟังก์ชันนี้:

$html = htmlspecialchars($html);

ตัวอักษรพิเศษมักจะแสดงแตกต่างกันใน HTML และอาจทำให้สับสนสำหรับคอมไพเลอร์ เหมือนจะกลายเป็น&&amp;


มีใครอธิบายได้ไหมว่าทำไมจึงถูกลดคะแนน htmlspecialchars()เป็นฟังก์ชันที่แม่นยำในการแปลง&, ", <, >ตัวอักษรในข้อมูลองค์ประกอบ
JacobRossDev

7
คำตอบนี้ถูกลงคะแนนทำให้ไม่ได้ผลในกรณีนี้ การใช้ฟังก์ชันดังกล่าวจะทำลาย XML ของคุณโดยสิ้นเชิงโดยการแปลง "<" เป็น "& lt;" ฉันไม่รู้วิธีใดที่คุณสามารถใช้htmlspecialchars()และไม่ทำลาย XML ฉันลองแฟล็กสองสามรายการและ XML ของฉันก็ยังพัง
Alex Finnarn

1
คุณควรใช้htmlspecialcharsกับเนื้อหาของแท็ก xml ไม่ใช่ใน XML ทั้งหมด
gbalduzzi

7

ฉันใช้เวอร์ชันรวม:

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

1
อันนี้ทำงานได้อย่างสมบูรณ์ คุณแค่ไม่มีวงเล็บปีกกาสิ้นสุด
myh34d

7

ปัญหา

  • ฟังก์ชัน PHP simplexml_load_fileทำให้เกิดข้อผิดพลาดparser error : xmlParseEntityRefในการแยกวิเคราะห์ขณะพยายามโหลดไฟล์ XML จาก URL

สาเหตุ

  • XML ที่ URL ส่งคืนไม่ใช่ XML ที่ถูกต้อง มันมีค่าแทน& &amp;ค่อนข้างเป็นไปได้ว่ามีข้อผิดพลาดอื่น ๆ ซึ่งไม่ชัดเจนในขณะนี้

สิ่งที่อยู่นอกเหนือการควบคุมของเรา

  • ตามหลักการแล้วเราควรตรวจสอบให้แน่ใจว่า XML ที่ถูกต้องเป็นฟีดในsimplexml_load_fileฟังก์ชันPHP แต่ดูเหมือนว่าเราไม่สามารถควบคุมวิธีสร้าง XML ได้
  • นอกจากนี้ยังไม่สามารถบังคับsimplexml_load_fileให้ประมวลผลไฟล์ XML ที่ไม่ถูกต้อง มันไม่ได้ทำให้เรามีตัวเลือกมากมายนอกเหนือจากการแก้ไขไฟล์ XML เอง

แนวทางแก้ไขที่เป็นไปได้

แปลง XML ไม่ถูกต้องเป็น XML ที่ถูกต้อง สามารถทำได้โดยใช้PHP tidy extension. ดูคำแนะนำเพิ่มเติมได้จากhttp://php.net/manual/en/book.tidy.php

เมื่อคุณแน่ใจว่ามีส่วนขยายอยู่หรือติดตั้งแล้วโปรดดำเนินการดังต่อไปนี้

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

ข้อควรระวัง

นักพัฒนาควรพยายามเปรียบเทียบ XML ที่ไม่ถูกต้องกับ XML ที่ถูกต้อง (สร้างขึ้นโดยเป็นระเบียบเรียบร้อย) เพื่อดูว่าไม่มีผลข้างเคียงใด ๆ หลังจากใช้ tidy Tidy ทำได้ดีมากในการทำอย่างถูกต้อง แต่มันไม่เคยเจ็บที่จะเห็นมันด้วยสายตาและมั่นใจได้ 100% ในกรณีของเราควรจะง่ายพอ ๆ กับการเปรียบเทียบ $ xml กับ $ tidy



3

สิ่งนี้อยู่ในการกระทำเนื่องจากอักขระที่ยุ่งกับข้อมูล การใช้htmlentities($yourText)งานสำหรับฉัน (ฉันมีรหัส html อยู่ในเอกสาร xml) ดูhttp://uk3.php.net/htmlentities


1

วิธีนี้ช่วยแก้ปัญหาของฉัน:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.