2010-10-31 14 views
6

मैं PHP DOMDocument साथ एक बड़ी समस्या :: सत्यापित करें() जो DTD व्यवस्थित पूछने के लिए लगता है की है।DOMDocument :: सत्यापित करें() समस्या

जब मैं मान्य करने के लिए whant यह एक बड़ी समस्या है, उदाहरण के लिए, एक XHTML दस्तावेज़ as explained here

w3.org के रूप में, एक PHP सर्वर से सभी अनुरोध को अस्वीकार कर रहा है यह इस विधि के साथ अपने दस्तावेज़ मान्य करने के लिए असंभव है ...

वहाँ उस के लिए किसी भी समाधान है?

/var/www/test.php:

<?php 
$implementation = new DOMImplementation(); 

$dtd = $implementation->createDocumentType 
     (
     'html',          // qualifiedName 
     '-//W3C//DTD XHTML 1.0 Transitional//EN', // publicId 
     'http://www.w3.org/TR/xhtml1/DTD/xhtml1-' 
      .'transitional.dtd'      // systemId 
     ); 

$document = $implementation->createDocument('', '', $dtd); 

$document->validate(); 

[http://]127.0.0.1/test.php:

Warning: DOMDocument::validate(http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden 
in /var/www/test.php on line 14 

Warning: DOMDocument::validate(): I/O warning : failed to load external entity "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" in /var/www/test.php on line 14 

Warning: DOMDocument::validate(): Could not load the external subset "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" in /var/www/test.php on line 14 

संबंधित

अग्रिम

[संपादित करें] यहां से धन्यवाद कुछ precisions है प्रश्न:

+0

सुनिश्चित नहीं हैं कि आपकी समस्या है। 'DOMDocument :: validate' लोड किए गए दस्तावेज़ के डीटीडी के आधार पर दस्तावेज़ को मान्य करता है। – Gordon

+0

उदाहरण के लिए, अगर मैं इस DTD प्रदान करते हैं: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd, जब मैं DOMDocument :: सत्यापित करें() कहते हैं, PHP फ़ाइल प्राप्त करने के लिए एक अनुरोध भेज , लेकिन w3.org के एक 403 निषिद्ध या एक 503 सेवा अनुपलब्ध के साथ योजनाबद्ध तरीके से जवाब देते हैं, और PHP मुझे चेतावनी भी भेज: बाहरी संस्था "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional लोड करने में विफल। डीटी " –

+4

मैं देखता हूं, हाँ। एक बग इसके लिए खुला है: http://bugs.php.net/bug.php?id=48080 – Gordon

उत्तर

8

जैसा टिप्पणी में कहा, वहाँ एक बग है/DOMDocument::validate के लिए FeatureRequest स्ट्रिंग के रूप DTD स्वीकार करने के लिए:

आप स्वयं को डीटीडी होस्ट कर सकते हैं और systemId तदनुसार बदल सकते हैं या आप libxml के माध्यम से किए गए किसी भी लोडिंग के लिए कस्टम स्ट्रीम संदर्भ प्रदान कर सकते हैं। उदाहरण के लिए, UserAgent प्रदान करने से W3C की अवरोधन हो जाएगी। आप इस तरह प्रॉक्सी भी जोड़ सकते हैं। देखें

उदाहरण:

$di = new DOMImplementation; 
$dom = $di->createDocument(
    'html', 
    'html', 
    $di->createDocumentType(
     'html', 
     '-//W3C//DTD XHTML 1.0 Transitional//EN', 
     'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' 
    ) 
); 
$opts = array(
    'http' => array(
     'user_agent' => 'PHP libxml agent', 
    ) 
); 
$context = stream_context_create($opts); 
libxml_set_streams_context($context); 

var_dump($dom->validate()); 

यह आउटपुट होगा

Warning: DOMDocument::validate(): Element html content does not follow the DTD, expecting (head , body), got 

Warning: DOMDocument::validate(): Element html namespace name for default namespace does not match the DTD 

Warning: DOMDocument::validate(): Value for attribute xmlns of html is different from default "http://www.w3.org/1999/xhtml" 

Warning: DOMDocument::validate(): Value for attribute xmlns of html must be "http://www.w3.org/1999/xhtml" 

bool(false) 
+1

बहुत दिलचस्प समाधान! यह कैशिंग के बिना व्यवस्थित अनुरोध की समस्या का समाधान नहीं करता है (w3 के लिए बहुत उचित नहीं है, लेकिन प्रत्येक बार जब भी यह सेवा की जाती है, तो दस्तावेज़ को सत्यापित करना आवश्यक नहीं है), लेकिन अब मैं अपने दस्तावेज़ों को प्रमाणित कर सकता हूं। धन्यवाद ^^ –

+1

@GQyy वास्तव में, सवाल पूछने के लिए धन्यवाद। इसने मुझे आज भी डोम के बारे में कुछ नया सीख लिया;) – Gordon

संबंधित मुद्दे