у меня был подобный вопрос к вам, я попробовал:
$crawler=new Crawler($someHtml);
$crawler->add('<element />');
и получил
Прикрепление DOM узлов из нескольких документов, в том же гусеничный запрещено ,
С DOMDocument
, вы используете свой собственный createElement
метод, чтобы сделать узел (ы), а затем прикрепить их к документу с appendChild
или любой другой. Но так как Crawler
, похоже, не имеет ничего подобного createElement, решение, которое я придумал, это инициализировать Crawler с помощью собственного документа dom, делать все, что вы хотите сделать с помощью искателя, но затем использовать документ dom как «узел фабрика ", когда вам нужно добавить узел.
Моя конкретная ситуация в том, что мне нужно проверить, если документ был head
, и добавьте (в частности, добавить его выше тела тега), если он не сделал:
$doc = new \DOMDocument;
$doc->loadHtml("<html><body bgcolor='red' /></html>");
$crawler = new Crawler($doc);
if ($crawler->filter('head')->count() == 0) {
//use native dom document to make a head
$head = $doc->createElement('head');
//add it to the bottom of the Crawler's node list
$crawler->add($head);
//grab the body
$body = $crawler
->filter('body')
->first()
->getNode(0);
//use insertBefore (http://php.net/manual/en/domnode.insertbefore.php)
//to get the head and put it above the body
$body->parentNode->insertBefore($head, $body);
}
echo $crawler->html();
дает
<head></head>
<body bgcolor="red"></body>
Кажется, немного запутанный, но он работает. Я имею дело с HTML, но я предполагаю, что решение XML будет почти таким же.