Проблема DOMDocument :: validate () - PullRequest
       17

Проблема DOMDocument :: validate ()

7 голосов
/ 31 октября 2010

У меня большая проблема с PHP DOMDocument :: validate (), который, кажется, систематически запрашивает DTD.

Это большая проблема, когда я хочу проверить, например, документ XHTML как объяснено здесь .

Поскольку 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

Смежный вопрос:

1 Ответ

8 голосов
/ 31 октября 2010

Как указано в комментариях, для DOMDocument::validate существует запрос об ошибке / FeatureRequest для принятия DTD в виде строки:

Вы можете самостоятельно разместить DTD и соответственно изменить systemId, или вы можете предоставить пользовательский контекст потока для любой загрузки, выполняемой через libxml. Например, предоставление UserAgent обойдет блокировку W3C. Вы также можете добавить прокси таким образом. Смотри

* * 1 022 Пример: * 1 023 *
$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)
...