Andy
Andy

Reputation: 454

rename multiple attributes with simpleXML

<root>
  <gallery name="First"/>
  <gallery name="Second"/>
  <gallery name="Third"/>
</root>

I'm trying to rename multiple "name" attributes at once:

$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 )

How can I get php to save the New values back to the XML? Does it need another foreach loop? The code seems to be getting too complex already.

I'm trying this, but no dice:

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

Upvotes: 1

Views: 683

Answers (1)

Xavier Barbosa
Xavier Barbosa

Reputation: 3947

Simplexml is buid to returns node only. That's weird, but '/root/gallery/@name' and '/root/gallery'.

These two queries

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

will return the same instances

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

So the only way for changing the attribute of a node is with the array syntaxe

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

Upvotes: 1

Related Questions