2016-11-29 3 views
3

J'ai besoin de gérer des documents xml dans saymfony.comment ajouter un noeud xml à un Crawler symfony()

Je n'ai aucun problème pour obtenir le xml dans une instance de Crawler(), modifier un nœud existant et après, mettre le xml dans un fichier.

Mais je ne peux pas ajouter un nouveau noeud.

Quand j'essaie d'ajouter un nouveau noeud avec la méthode appendChild au parent, j'ai:

mauvaise erreur document

Et quand je tente la méthode ajouter à la chenille, j'ai:

impossible d'ajouter deux sources différentes au robot?

Que puis-je faire pour ajouter un noeud simple à un moteur de balayage existant?

Merci pour toute réponse

Répondre

0

J'ai eu un problème similaire à vous, j'ai essayé:

$crawler=new Crawler($someHtml); 
$crawler->add('<element />'); 

et ont

Fixation DOM nœuds à partir de plusieurs documents dans le même robot est interdit .

Avec un DOMDocument, vous utiliser sa propre méthode createElement pour faire le noeud (s), puis les attacher au document avec appendChild ou autre. Mais puisque Crawler ne semble pas avoir quelque chose comme createElement, la solution que j'ai trouvée est d'initialiser le Crawler avec un document natif, faire ce que vous voulez faire avec le Crawler, mais ensuite utiliser le document dom comme un "nœud" usine "lorsque vous avez besoin d'ajouter un noeud.

Ma situation est que je dois vérifier si un document avait un head, et ajouter un (ajouter spécifiquement au-dessus de la balise body) si elle n'a pas:

 $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(); 

cède

<head></head> 
<body bgcolor="red"></body> 

Il semble un peu compliqué mais ça marche. Je traite du HTML mais j'imagine qu'une solution XML serait presque la même.