2010-11-22 5 views
1
<root> 
    <gallery name="First"/> 
    <gallery name="Second"/> 
    <gallery name="Third"/> 
</root> 
mehrere Attribute umbenennen

ich mehrere "name" Attribute auf einmal umbenennen bin versucht:mit 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); 

Returns:

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) 

Wie kann ich php bekommen das Neue zu retten Werte zurück zum XML? Braucht es eine weitere foreach-Schleife? Der Code scheint bereits zu komplex zu werden.

Ich versuche das, aber keine Würfel:

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

i don Ich sehe nicht, wie '$ rename' im Code verwendet wurde. – stillstanding

+0

Ich bin mir nicht sicher, ob Sie das suchen, aber yo Sie können eine Variable in einer foreach-Schleife als Referenz verwenden (so dass sie tatsächlich geändert wird). Für Ihren Code wäre das: 'foreach ($ objXML-> xpath ('/ root/gallery/@ name') als & $ gallery) {'. Alle Änderungen, die an "$ gallery" vorgenommen werden, bleiben "hängen". –

+0

Ausgezeichnet, genau das habe ich bereits in meinem Beispiel oben. Es ist das Bit innerhalb der Schleife, das ich aussortieren muss. – Andy

Antwort

1

simplexml wird nur kehrt Knoten buid. Das ist seltsam, aber '/root/gallery/@name' und '/root/gallery'.

Diese beiden Abfragen

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

kehrt die gleichen Instanzen

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

So ist die einzige Möglichkeit, das Attribut eines Knotens zum Ändern mit dem Array ist syntaxe

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