У меня нет проблем, чтобы заставить его работать, единственная ошибка, которую я могу найти, это то, что вы загружаете XML, содержащий там не HTML-фрагмент HTML, который нарушает работу документа: метаэлементы в разделе head не являются закрыты.
См. Демонстрацию .
Совет: Всегда активируйте ведение журнала ошибок и отчетов, проверяйте предупреждения и уведомления, если вы разрабатываете и отлаживаете код. Короткая однострочная строка с отображением всех сообщений об ошибках PHP, вкл. предупреждения , уведомления и строгие :
error_reporting(-1); ini_set('display_errors', 1);
DOMDocument - это разговорчивый материал о некорректных элементах при загрузке XML.
Исправление XML "на лету"
DomDocument принимает только допустимый XML. Если у вас есть HTML, вы также можете попробовать, если DOMDocument::loadHTML()
тоже справится с работой, однако тогда он преобразует загруженную строку в документ X (HT) ML. Наверное, не то, что вы ищете.
Чтобы избежать загрузки определенной части строки и сделать ее совместимой с XML, вы можете искать строковые шаблоны, чтобы получить подстроку, представляющую HTML-код внутри XML, и правильно XML-кодировать ее.
например. вы можете искать <html>
и </html>
в качестве окружающих тегов, извлечь подстроку целого и заменить ее на substr_replace()
. Чтобы закодировать HTML для использования в качестве данных внутри XML, используйте функцию htmlspecialchars()
, она заменит все пять элементов в , другой ответ SO .
Код макета:
$htmlStart = strpos($xml, '<html>');
if (false === $htmlStart) throw new Exception('<html> not found.');
$htmlEnd = strpos($xml, '</html>', $htmlStart);
if (false === $htmlStart) throw new Exception('</html> not found.');
$htmlLen = $htmlEnd - $htmlStart + 7;
$htmlString = substr($xml, $htmlStart, $htmlLen);
$htmlEscaped = htmlspecialchars($htmlString, ENT_QUOTES);
$xml = substr_replace($xml, $htmlEscaped, $htmlStart, $htmlLen);