2010-11-22 8 views
1
<root> 
    <gallery name="First"/> 
    <gallery name="Second"/> 
    <gallery name="Third"/> 
</root> 

J'essaie de renommer plusieurs "nom" à la fois les attributs:renommer plusieurs attributs avec simpleXML

$rename = array(); 
foreach($_POST['name'] as $value) { 
    $rename[] = $value; 
} 

$objXML = new SimpleXMLElement(XML_FILE_NAME, null, true); 
$gallery = $objXML->xpath('/root/gallery/@name'); 
print_r($gallery); 
print_r($rename); 

$objXML->asXML(XML_FILE_NAME); 

Retours:

Array ([0] => SimpleXMLElement Object ([@attributes] => Array ([name] => First)) [1] => SimpleXMLElement Object ([@attributes] => Array ([name] => Second)) [2] => SimpleXMLElement Object ([@attributes] => Array ([name] => Third))) 

Array ([0] => First New [1] => Second New [2] => Third New) 

Comment puis-je obtenir php pour enregistrer le nouveau des valeurs de retour au XML? A-t-il besoin d'une autre boucle foreach? Le code semble devenir trop complexe déjà.

Je suis en train, mais pas de dés:

foreach($objXML->xpath('/root/gallery/@name') as $gallery) { 
    $gallery = $_POST['name']; 
} 
+0

i don Je ne vois pas comment '$ rename' a été utile dans le code – stillstanding

+0

Je ne sais pas si c'est ce que vous cherchez, mais Vous pouvez utiliser une variable par référence (de sorte qu'elle le modifie réellement) dans une boucle foreach. Pour votre code, ce serait: 'foreach ($ objXML-> xpath ('/ root/gallery/@ nom') en tant que & $ gallery) {'. Toute modification apportée à '$ gallery' va" coller ". –

+0

Excellent, c'est exactement ce que j'ai déjà dans mon exemple ci-dessus. C'est le morceau à l'intérieur de la boucle que j'ai besoin de trier. – Andy

Répondre

1

SimpleXML est buid au nœud de retour seulement. C'est bizarre, mais '/root/gallery/@name' et '/root/gallery'.

Ces deux requêtes

$aList = $objXML->xpath('/root/gallery/@name'); 
$bList = $objXML->xpath('/root/gallery'); 

renverra les mêmes instances

for($i=0, $count=count($aList); $i<$count; $i++) { 
    $a = $aList[$i]; 
    $b = $aList[$i]; 
    var_dump($a==$b); // true 
} 

La seule façon de changer l'attribut d'un nœud est avec le tableau syntax

foreach($aList as $node) { 
    $node['name'] = 'foo' . $i; 
} 
var_dump($objXML);