2010-09-07 7 views
0

Je me rends compte que ma requête n'est pas possible avec SimpleXML - ce que j'ai compris. Voici ce que j'ai essayé:Déplacement d'un nœud d'un document XML vers un autre en utilisant SimpleXML

$newXML = simplexml_load_file($filePath); 
$domNewXML = dom_import_simplexml($newXML); 
$domItem = dom_import_simplexml($items[$itemQty]); <-- item I want to move 
$domNewItem = $domItem->cloneNode(true); 
$newNode = $domNewXML->importNode($domNewItem, true); 
$domNewXML->getElementsByTagName('list')->item(0)->appendChild($newNode); 

Je me rends compte des erreurs de code sur la ligne 5, parce que importNode est fonction du document dom, pas l'élément dom, mais comment puis-je obtenir le document de dom pour effectuer cette étape ?

Est-ce que je vais dans ce sens? Dans le grand ordre des choses, j'ai un fichier XML avec au moins 10 nœuds, chaque jour un travail CRON vérifie s'il y a plus de 10 nœuds et si c'est le cas, il est censé déplacer le nœud du fichier courant dans un fichier d'archive. J'ai pensé que je "déplacerais" le noeud en le copiant dans le fichier d'archive et en le supprimant du fichier d'origine.

Merci pour toute aide!

Répondre

1

Vous pouvez obtenir le document, propriétaire via $anyDOMNode->ownerDocument


Peut-être pas nécessaire de cloner et d'insérer les noeuds dans un autre document. Si vous divisez l'archive en a) un document XML squelette et b) un fragment xml inclus comme une entité externe dans le document, il suffira si vous ajoutez simplement la représentation de chaîne xml du nœud à la fin du fichier fragment. Par exemple. comme le squelette

<?xml version="1.0"?> 
<!DOCTYPE fooarchive [ 
    <!ENTITY entries SYSTEM "archive.fragment"> 
]> 
<fooarchive> 
    &entries; 
</fooarchive> 

et le script php

$doc = new SimpleXMLElement('<a> 
    <b>0</b><b>1</b><b>2</b><b>3</b> 
    <b>4</b><b>5</b><b>6</b><b>7</b> 
    <b>8</b><b>9</b><b>X</b><b>Y</b> 
</a>'); 

$move = ''; 
for($i=10; $i<count($doc->b); $i++) { 
    $move .= $doc->b[$i]->asXML(); 
} 
file_put_contents('archive.fragment', $move, FILE_APPEND); 

for($i=count($doc->b)-1; $i>9; $i--) { 
    unset($doc->b[$i]); 
} 
echo $doc->asXML('current.xml'); 
+0

Je pensais que vous ne pouviez pas les noeuds via unset simpleXML? Quelle est la signification du fragment? Votre réponse est très utile d'ailleurs - merci! – NightHawk

+0

Est-ce que ça va s'ajouter après le bon noeud? – NightHawk

+0

Qu'est-ce qui vous a donné l'impression que vous ne pouvez pas supprimer les nœuds/éléments via SimpleXML? La chose "intéressante" à propos du fragment est que vous n'avez pas à l'analyser quand vous ajoutez un élément. C'est bon pour les grands documents et les applications gourmandes en performance. Mais si vous avez choisi cette technique, essayez d'abord si et comment votre application client résout l'entité externe (par exemple firefox ne le fait pas). – VolkerK

Questions connexes