Много небольших проблем, продолжающихся здесь..., самая большая проблема, тем не менее, состоит в том, что вы не можете использовать узел объекта simplexml в качестве индекса во множестве. Это должно быть вручную снято как последовательность или целое число. Вы были бы также лучше обслужены, щипнув ваше выражение XPath немного, и ваша петля не должна быть на $person, который является переменной, которая не существует, но вместо этого на $category. Попробуйте это как альтернативу:
$array = array();
$category = $xml->xpath('//person');
while(list( , $p) = each($category)) {
$array[(string)$p['id']] = (string)$p['name'];
}
print_r($array);
Также обратите внимание, что, если ваш xml не действительный XML, то это имеет значение... simplexml библиотеки, никогда не будет функционировать правильно на недействительном xml (у xml в вашем примере есть некоторое неподходящее вложение).