переименовать несколько атрибутов с помощью simpleXML - PullRequest
1 голос
/ 22 ноября 2010
<root>
  <gallery name="First"/>
  <gallery name="Second"/>
  <gallery name="Third"/>
</root>

Я пытаюсь переименовать несколько атрибутов "name" одновременно:

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

Возвращает:

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 )

Как мне получить php для сохранения новых значений обратно в XML? Нужен ли еще один цикл foreach? Код кажется уже слишком сложным.

Я пробую это, но без игры в кости:

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

1 Ответ

1 голос
/ 22 января 2011

Simplexml создается только для возвращаемого узла.Это странно, но '/root/gallery/@name' и '/root/gallery'.

Эти два запроса

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

будут возвращать одинаковые экземпляры

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

Так что единственный способ изменитьатрибут узла имеет синтаксис массива

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