2015-12-18 3 views
0

J'utilise actuellement le code PHP ci-dessous pour obtenir un 'imagepath', puis je boucle le code XML pour supprimer le noeud qui a ce chemin.Copier un noeud XML dans un autre fichier

<?php  
$id = $_GET['imagepath'];  
$xmldoc = new DOMDocument(); 
$xmldoc->load('newcoke.xml'); 
$root = $xmldoc->documentElement; 
$fnode = $root->firstChild; 

$items = $xmldoc->getElementsByTagName('flight'); 
foreach ($items as $item){ 
    $node = $item->getElementsByTagName('imagepath')->item(0); 
    if ($node->nodeValue == $id){ 
     $node->parentNode->parentNode->removeChild($node->parentNode);    
    } 
} 
$xmldoc->save('newXmlFile.xml'); 
?> 

J'ai essayé pendant des heures puis effectuez un copier en quelque sorte le nœud supprimé et l'enregistrer dans un nouveau fichier XML avec la même structure qui existe appelée « supprimé ». Quelqu'un peut-il aider?

C'est la structure du xml:

<ArrivingFlights> 
    <flight> 
     <to>Ger</to> 
     <from>Mammy xx</from> 
     <imagepath>0002.jpg</imagepath> 
     <templateStyle>template1</templateStyle> 
     <time>08:00</time> 
     <date>21/12/15</date> 
    </flight> 
    <flight> 
     <to>Ciara</to> 
     <from>Vikki xx</from> 
     <imagepath>0003.jpg</imagepath> 
     <templateStyle>template1</templateStyle> 
     <time>11:00</time> 
     <date>17/12/15</date> 
    </flight> 
</ArrivingFlights> 
+0

pouvez-vous nous montrer quelques exemples xml – Afsar

+0

@zan Ive fait un montage. merci –

+0

Pouvez-vous s'il vous plaît également fournir un exemple de cette "même structure qui existe appelé" supprimé "" afin que nous puissions voir quelle partie de la structure que vous souhaitez copier? – VolkerK

Répondre

0

DOMNode::removeChild retourne le nœud, il vient de supprimer; cet objet est toujours valide ... pour l'instance DOM dont il a été retiré.
Pour l'utiliser dans un autre DOM, vous devez le import, avant de l'ajouter à un élément/noeud dans cette autre instance DOM.

if ($node->nodeValue == $id){ 
    $rn = $node->parentNode->parentNode->removeChild($node->parentNode); 
    $deletedFlight = $otherDom->importNode($rn, true); // make a deep-copy for the other DOM 
    $otherDom->documentElement->appendChild($deletedFlight); 
} 

... ou vous pouvez passer $ rn à DOMDocument::saveXML() et ajouter la valeur de retour à un fichier via file_put_contents(..,.., FILE_APPEND). Le fichier résultant ressemblerait

<flight> 
    <to>Ger</to> 
    <from>Mammy xx</from> 
    <imagepath>0002.jpg</imagepath> 
    <templateStyle>template1</templateStyle> 
    <time>08:00</time> 
    <date>21/12/15</date> 
</flight> 
<flight> 
    <to>Ciara</to> 
    <from>Vikki xx</from> 
    <imagepath>0003.jpg</imagepath> 
    <templateStyle>template1</templateStyle> 
    <time>11:00</time> 
    <date>17/12/15</date> 
</flight> 

qui n'est pas XML valide (plus d'un élément de niveau supérieur) ... mais ... Vous pouvez importer ce fichier comme une entité dans un document XML valide. De cette façon (en faisant un peu attention) vous pouvez vous débarrasser du second DOM et du temps et de la mémoire qu'il faut pour le construire.

+0

Im obtenir ces erreurs Avertissement: DOMDocument :: load(): le document est vide dans le fichier:/C: /xampp/htdocs/coke/deleted.xml, ligne: 1 dans C: \ xampp \ htdocs \ coke \ ApproveImage.php à la ligne 11 Avertissement: DOMDocument :: load(): Balise de démarrage attendue, '<' introuvable dans le fichier:/C: /xampp/htdocs/coke/deleted.xml, ligne: 1 dans C: \ xampp \ htdocs \ coke \ ApproveImage.php à la ligne 11 Remarque: Vous tentez d'obtenir la propriété de non-objet dans C: \ xampp \ htdocs \ coke \ ApproveImage.php à la ligne 13 Erreur fatale: appel à un membre fonction appendChild() sur un non-objet dans C: \ xampp \ htdocs \ coke \ ApproveImage.php sur la ligne 22 –

+0

Oh, il fallait du contenu pour suspendre, merci mate –