Проблема в том, что DOM не знает, что он должен учитывать DTD XHTML, если вы не проверили документ по нему.Если вы не сделаете этого, DOM не будет знать ни сущностей, определенных в DTD, ни каких-либо других правил в нем.К счастью, мы выяснили, как выполнить проверку в этом другом вопросе , поэтому вооружившись этими знаниями, вы можете
$document->validate(); // anywhere before importing the other DOM
и затем импортировать с помощью
$fragment = $document->createDocumentFragment();
$fragment->appendXML('<h1>Hello</h1><p>Hello World</p>');
$document->getElementsByTagName('body')->item(0)->appendChild($fragment);
$document->formatOutput = TRUE;
echo $document->saveXml();
output:
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My bweb page</title>
</head>
<body>
<h1>Hello</h1>
<p>Hello World</p>
</body>
</html>
Другой способ импортировать XML в другой DOM - использовать
$one = new DOMDocument;
$two = new DOMDocument;
$one->loadXml('<root><foo>one</foo></root>');
$two->loadXml('<root><bar><sub>two</sub></bar></root>');
$bar = $two->documentElement->firstChild; // we want to import the bar tree
$one->documentElement->appendChild($one->importNode($bar, TRUE));
echo $one->saveXml();
output:
<?xml version="1.0"?>
<root><foo>one</foo><bar><sub>two</sub></bar></root>
Однако это не может работать с
<h1>Hello</h1><p>Hello World</p>
, поскольку при загрузке документа в DOM DOM перезаписывает все, что вы говорили об этом документе ранее.Таким образом, при использовании load libxml (и, следовательно, SimpleXml, DOM и XMLReader) не (не) знают, что вы имеете в виду XHTML.И он не знает никаких сущностей, определенных в нем, и вместо этого будет размышлять о них.Но даже если строка не будет содержать сущность, она не является допустимым XML, поскольку в ней отсутствует корневой узел.Вот почему вы используете фрагмент.