2010-02-14 19 views
5

मैं वर्तमान में एक समस्या XML पार्सर के रूप XHTML में पढ़ने एचटीएमएल चरित्र संस्थाओं तो नहीं पहचानता है है: मेंDOMDocument :: loadXML बनाम HTML संस्थाओं

<?php 
$text = <<<EOF 
<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Entities are Causing Me Problems</title> 
    </head> 
    <body> 
    <p>Copyright &copy; 2010 Some Bloke</p> 
    </body> 
</html> 
EOF; 

$imp = new DOMImplementation(); 
$html5 = $imp->createDocumentType ('html', '', ''); 
$doc = $imp->createDocument ('http://www.w3.org/1999/xhtml', 'html', $html5); 

$doc->loadXML ($text); 

header ('Content-Type: application/xhtml+xml; charset: utf-8'); 
echo $doc->saveXML(); 

परिणाम:

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Entity 'copy' not defined in Entity, line: 8 in testing.php on line 19

एक्सएचटीएमएल 5 के रूप में पृष्ठों को प्रस्तुत करने की अनुमति देते हुए मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

11

एक्सएचटीएमएल 5 में डीटीडी नहीं है, इसलिए आप पुराने स्कूल एचटीएमएल नामित इकाइयों का उपयोग नहीं कर सकते हैं, क्योंकि इस भाषा के लिए नामित संस्थाएं क्या हैं, इस बारे में पार्सर को बताने के लिए कोई दस्तावेज़ प्रकार परिभाषा नहीं है। (पूर्वनिर्धारित एक्सएमएल इकाइयों &lt;, &amp;, &quot; और &gt; ... और &apos; के अलावा, हालांकि आप आमतौर पर इसका उपयोग नहीं करना चाहते हैं) के अलावा।

इसके बजाय एक आंकिक केरेक्टर सन्दर्भ (&#169;) या, बेहतर है, बस एक सादे unencoded © वर्ण का उपयोग (UTF-8 में, चरित्र गैर एक्सएमएल पारसर्स करने के लिए सेट सूचित करने के लिए <meta> तत्व शामिल करना न भूलें)।

+0

इसके आसपास कुछ खोज करने के बाद वास्तव में मामला प्रतीत होता है। अजीब लगता है लेकिन जानकारी के लिए बहुत बहुत धन्यवाद। – casr

+0

+1 वाह, एचटीएमएल 5 में डीटीडी नहीं है? उसे नहीं पता था। – Gumbo

+0

एचटीएमएल 5 अपने पुराने एचटीएमएल नामित इकाइयों को अपने spec के हिस्से के रूप में परिभाषित करता है, यह केवल * एक्सएचटीएमएल 5 * है जो नहीं करता है, और यह मुख्य रूप से इसलिए है क्योंकि * एक्सएमएल * को डीटीडी में परिभाषित करने की आवश्यकता है जो एचटीएमएल 5/एक्सएचटीएमएल 5 नहीं है। – thomasrutter

2

इसके बजाय DOMDocument::loadHTML() का उपयोग करने का प्रयास करें। यह अपूर्ण मार्कअप पर चकित नहीं है।

+4

इससे कुछ फंकी आउटपुट (http://paste2.org/p/668291) का उल्लेख नहीं किया जाता है, मुझे HTML के रूप में XML को पार्स करने का विचार पसंद नहीं है। – casr

0

आप loadXML और saveXML उपयोग नहीं करना चाहिए और

<?xml. 

इसके बजाय कि loadHTML और saveHTML का उपयोग टैग एक HTML दस्तावेज़ के शीर्ष पर जोड़ सकते हैं और जोड़ने के एक

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 


0

हाइड के साथ प्रयास करें

$text = <<<EOF 
<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Entities are Causing Me Problems</title> 
    </head> 
    <body> 
    <![CDATA[<p>Copyright &copy; 2010 Some Bloke</p>]]> 
    </body> 
</html> 
EOF;