'xmlParseEntityRef: कोई नाम नहीं' एक php फ़ाइल में xml लोड करते समय चेतावनियाँ


90

मैं का उपयोग कर php में एक xml पढ़ रहा हूँ 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 में एक वेरिएबल में लोड की गई है। I में प्रिवलेज को index.php पर लिखना नहीं है)


XML अमान्य है। आप इसे लोड करने में सक्षम नहीं हो सकते हैं। त्रुटियों को @सामने जोड़कर simplexml_load_fileया ध्वज जोड़कर दबाया जा सकता है , simplexml_load_fileअधिक जानकारी के लिए मैनुअल पृष्ठ देखें और कृपया अपना प्रश्न हटाएं, यह एक डुप्लिकेट है।
हकर्रे

मैं देख सकता हूं कि मेरे जवाब पर काफी ध्यान दिया जा रहा है, अगर यह वास्तव में समाधान है: क्या आप इसे "सही उत्तर" के रूप में चिह्नित कर सकते हैं? धन्यवाद।
ricricucit

जवाबों:


144

XML शायद सबसे अमान्य है।

समस्या "और" हो सकती है

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

"&" से छुटकारा मिलेगा और इसे HTML कोड संस्करण के साथ बदल देगा ... इसे आज़माएं।


2
धन्यवाद। आपने मेरा दिन बचाया!
सायम

2
एक्सएमएल के साथ काम करते समय सबसे अच्छा अभ्यास यह सुनिश्चित करना है कि कोई परस्पर विरोधी चरित्र नहीं हैं और आपको पार्सिन से पहले उन्हें बदलना चाहिए
श्री

2
धन्यवाद, इस सवाल का मुख्य बिंदु यह है क्योंकि xml अमान्य है
yusan

यदि आप सभी एम्परसेंड्स को बदलना चाहते हैं, तो बस थोड़ा सा जोड़कर, अपने रेगेक्स में 'जी' जोड़ें। अद्यतन समाधान इस तरह दिखेगा: $text=preg_replace('/&(?!#?[a-z0-9]+;)/g', '&amp;', $text);
flaming.codes

81

यहां मिला ...

समस्या: एक XML पार्सर त्रुटि "xmlParseEntityRef: noname" लौटाता है

कारण: XML पाठ उदा में कहीं न कहीं एक आवारा 'और' (एम्परसेंड चरित्र) है। कुछ पाठ और कुछ और पाठ

समाधान:

  • समाधान 1: एम्परसेंड निकालें।
  • समाधान 2: एम्परसेंड को एनकोड करें (जो कि &कैरेक्टर को रिप्लेस करता है &amp;)। XML पाठ को पढ़ते समय याद रखें।
  • समाधान 3: CDATA अनुभागों का उपयोग करें (CDATA अनुभाग के अंदर का पाठ पार्सर द्वारा अनदेखा किया जाएगा।) उदा। <! [CDATA [कुछ पाठ और कुछ और पाठ]]>

नोट: '' और '' <''> '' सही ढंग से संभाले नहीं तो सभी समस्याएँ देंगे।


9
इसने आज मुझे बचा लिया।
बृज

क्या हम जानते हैं कि ऐसा क्यों है? इसके अलावा, क्या कोई CDATA अनुभाग अभी भी एक ब्राउज़र द्वारा उठाया जाएगा जो इस डेटा में से कुछ को प्रस्तुत करेगा? मेरे XML टैग्स के अंदर कुछ HTML टैग्स हैं और मुझे उन्हें एडिटिंग टूल के लिए अंतिम उपयोगकर्ता को प्रदान करने की आवश्यकता है।
सुलिमेश

11

इस फ़ंक्शन का उपयोग करके पहले HTML को साफ़ करने का प्रयास करें:

$html = htmlspecialchars($html);

विशेष वर्णों को आमतौर पर HTML में अलग-अलग रूप में दर्शाया जाता है और यह संकलक के लिए भ्रामक हो सकता है। जैसा &बन जाता है &amp;


क्या कोई समझा सकता है कि यह नीचा क्यों है? तत्व डेटा में वर्णों htmlspecialchars()को परिवर्तित करने का सटीक कार्य है &, ", <, >
जैकबॉसडेव

7
यह उत्तर अस्वीकृत है क्योंकि यह इस मामले में अच्छी तरह से काम नहीं करता है। उस फ़ंक्शन का उपयोग करने से "<" को "& lt;" में कनवर्ट करने से आपका XML पूरी तरह से टूट जाएगा। मैं ऐसे किसी भी तरीके से अनजान हूँ जिसका उपयोग आप कर सकते हैं htmlspecialchars()और XML को तोड़ नहीं सकते । मैंने कुछ झंडे आज़माए और मेरा XML टूट गया।
एलेक्स फिननार

1
आपको htmlspecialcharsxml टैग की सामग्री पर उपयोग करना चाहिए , पूरे XML पर नहीं
गाल्बुज्जी

7

मैं एक संयुक्त संस्करण का उपयोग करता हूं:

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

1
यह पूरी तरह से काम कर रहा है। आपको बस सही ब्रैकेट याद आ रहा है
myh34d

7

मुसीबत

  • किसी URL से XML फ़ाइल को लोड करने का प्रयास करते समय PHP फ़ंक्शन simplexml_load_fileपार्सिंग त्रुटि को फेंक parser error : xmlParseEntityRefरहा है।

कारण

  • URL द्वारा दिया गया XML एक मान्य XML नहीं है। इसके &स्थान पर मान होता है &amp;। यह बहुत संभव है कि अन्य त्रुटियां हैं जो इस समय स्पष्ट नहीं हैं।

हमारे नियंत्रण के बाहर

  • आदर्श रूप से, हमें यह सुनिश्चित करना चाहिए कि एक वैध XML PHP simplexml_load_fileफ़ंक्शन में फीड हो , लेकिन ऐसा लगता है कि हमारे पास 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 इसे सही ढंग से करने का एक बहुत अच्छा काम करता है, लेकिन इसे नेत्रहीन रूप से देखने और 100% सुनिश्चित होने के लिए कभी भी दर्द नहीं होता है। हमारे मामले में यह $ tml के साथ $ xml की तुलना करने के रूप में सरल होना चाहिए।



3

यह डेटा के साथ खिलवाड़ करने वाले पात्रों के कारण विलेख में है। htmlentities($yourText)मेरे लिए काम करना (मेरे पास xml दस्तावेज़ के अंदर html कोड था)। 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))));

1

यदि आप इस मुद्दे को opencart के साथ संपादित करने का प्रयास कर रहे हैं

कैटलॉग / कंट्रोलर / एक्सटेंशन / फीड / google_sitemap.php अधिक जानकारी के लिए और यह कैसे करना है: xmlparseentityref-no-name-error

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.