2016-11-29 7 views
3

Мне нужно управлять XML-документами в saymfony.Как добавить узел xml в Symfony Crawler()

У меня нет проблем, чтобы получить xml в экземпляр Crawler(), изменить существующий узел и после него поместить xml в файл.

Но я не могу добавить новый узел.

Когда я пытаюсь добавить новый узел с методом AppendChild родителю, у меня есть:

неправильно ошибки документ

И когда я попробовать метод добавления к гусеничном, у меня есть:

Невозможно добавить два источника различий в сканер?

Что я могу сделать, чтобы добавить простой узел к существующему гусеничному процессу?

Спасибо за любой ответ

ответ

0

у меня был подобный вопрос к вам, я попробовал:

$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 будет почти таким же.