2010-03-04 8 views
0

Im en utilisant SimpleXML pour ajouter de nouvelles images Childs pour un outil de diaporama sur mon site, le code est quelque chose comme ceci:SimpleXML: Trier XML - Lieu XML Entrées en haut

$xml_toload = $_SERVER['DOCUMENT_ROOT']. '/xml/'.$country.'/compact.xml'; 
$xml = simplexml_load_file($xml_toload); //This line will load the XML file. 

$sxe = new SimpleXMLElement($xml->asXML()); 
//In this line it create a SimpleXMLElement object with the source of the XML file. 
//The following lines will add a new child and others child inside the previous child created. 
$image = $sxe->addChild('image'); 
$image->addAttribute('imageURL',$file); 
$image->addAttribute('thumbURL',$file); 
$image->addAttribute('linkURL',$linkurl); 
$image->addAttribute('linkTarget',$linkurl); 
$image->addChild('caption',$caption); 

$sxe->asXML($xml_toload); 

Ce qui fonctionne parfaitement pour ajouter la nouvelle <image attr="blabla"><caption>imageinfo</caption><image> enfant, à l'intérieur de <imagegallery></imagegalley>

Mais j'ai un problème sérieux, j'ai besoin ce childs aller juste après <imagegallery>, pas avant la balise est fermée, (l'un après l'autre), ce qui rend apparaître de nouvelles images , à la dernière place sur le diaporama imagegallery.

Si vous voulez chids que j'ajouter, devrait aller avant la dernière, il a ajouté au xml, comme

<imagegallery> 
<image attr="HEREGOESTHENEWST"> 
    <caption>description</caption> 
</image> 
<image attr="THEOLDONE"> 
    <caption>description</caption> 
</image> 
</imagegallery> 

Tout le monde peut me aider avec un exemple clair? Merci, c'est urgent!

Répondre

0

SimpleXML ne prend pas en charge ce type de manipulation. Actuellement, il ne peut que joindre des enfants. Pour insérer des enfants à des endroits arbitraires dans l'arbre, vous avez besoin de DOM et DOMNode::insertBefore() spécifiquement. Le problème est que DOM est verbeux et cela le rend agaçant à utiliser, c'est pourquoi quand je dois faire ce genre de choses, j'utilise un mélange de SimpleXML et DOM. Le résultat est devenu une bibliothèque nommée à juste titre SimpleDOM: use DOM methods with SimpleXML grammar.

De plus, voici quelques conseils que je recommande comme une bonne pratique:

  • Chaque fois que vous créez un objet SimpleXMLElement, nommez après le nœud qu'il représente. Ne le nommez jamais $xml. "XML" est un langage de balisage, c'est du texte. Si je voyais un $xml var je pense qu'il contient du texte. La même chose s'applique à votre var $xml_toload. Il ne contient pas de XML, il contient un chemin de fichier. Par conséquent, il devrait s'appeler quelque chose comme $filepath. Vous n'avez pas à utiliser addAttribute() ou addChild() pour tout. Il est souvent plus simple d'utiliser la notation de tableau et/ou la notation d'objet.

Le script de résultat:

include 'SimpleDOM.php'; 

// create an <image/> element 
$image = new SimpleXMLElement('<image/>'); 
$image['imageURL'] = $file; 
$image['thumbURL'] = $file; 
$image['linkURL'] = $linkurl; 
$image['linkTarget'] = $linkurl; 
$image->caption  = $caption; 

// load the file 
$path_to_file = $_SERVER['DOCUMENT_ROOT']. '/xml/'.$country.'/compact.xml'; 
$imagegallery = simpledom_load_file($path_to_file); 

// insert the new element before the first <image/> 
$imagegallery->insertBefore($image, $imagegallery->image[0]); 

// save the file 
$imagegallery->asXML($path_to_file); 
+0

Wow John, vous me surpris par cette réponse, il était aussi clair que l'eau Hawaiienne océan. Je dois être honnête, j'ai été avec PHP pendant longtemps, mais je n'ai jamais eu la chance ou l'obligation de manipuler des fichiers XML, pas ma spécialité – BoDiE2003

Questions connexes