Чтобы иметь возможность разобрать этот документ (который не очень хорошо сформированный) я бы рекомендовал сделать следующее:
$xmlString = file_get_contents('rapleaf.xml');
$xmlString = str_replace('&', '&', $xmlString);
if(!$xml=simplexml_load_string($xmlString)){
trigger_error('Error reading XML file',E_USER_ERROR);
}
Сначала прочитайте файл в строку, то замените амперсанды (в пределах ссылки) со своей сущностью. Чтобы создать объект xml, вы можете использовать функцию simplexml_load_file().
Теперь вы можете проанализировать документ. Насколько я вижу, в каждом файле есть только один человек. Поэтому вам не нужен цикл foreach. Но вы можете анализировать все поле, вам просто нужно знать, как это сделать. Вот некоторое более сложное exmaple разбора разных вещей с разными методами:
echo ' Name: '.(string)$xml->basics->name. '
<br /> Age: '.(string)$xml->basics->age.'
<br /> gender: '.(string)$xml->basics->gender.'
<br /> Address: '.(string)$xml->basics->location;
// There might be more than one occupation
foreach($xml->occupations as $occupation){
echo '<br /> Occupation: '.$occupation->attributes()->title;
if(isset($occupation->attributes()->company)){
echo '; at company: '.$occupation->attributes()->company;
}
}
// There might be more than one university
foreach($xml->universities as $university){
echo '<br /> University: '.$university;
}
echo '<br /> first seen: '.(string)$xml->basics->earliest_known_activity.'
<br /> last seen: '.(string)$xml->basics->latest_known_activity.'
<br /> Friends: '.(string)$xml->basics->num_friends;
// getting all the primary membership pages
foreach($xml->memberships->primary->membership as $membership){
if($membership->attributes()->exists == "true"){
echo '<br />'.$membership->attributes()->site;
if(isset($membership->attributes()->profile_url)){
echo ' | '.$membership->attributes()->profile_url;
}
if(isset($membership->attributes()->num_friends)){
echo ' | '.$membership->attributes()->num_friends;
}
}
}
для текста, который включен в теге, вы должны бросить его в строку:
echo 'Name: '.(string)$xml->basics->name;
Чтобы получить значение атрибут тега, используйте функцию attributes(). Вы не должны бросить его на этот раз:
echo 'Occupation: '.$xml->occupations->occupation[0]->attributes()->title;
Как вы можете видеть, вы также можете получить конкретный дочерний узел, так как все дочерние узлы хранятся в массиве. Просто используйте индекс.Если вам нужен только один дочерний узел, вам не нужно использовать для этого цикл.
Но вам всегда нужно убедиться, что элемент, используемый вами функцией attirbutes(), действителен, так как в противном случае будет выдана ошибка. Таким образом, может потребоваться проверить, что через isset(), чтобы быть уверенным.
У меня теперь есть идея о том, как разбирать некоторые XML с помощью SimpleXML. Если у вас есть дополнительные вопросы, просто спросите еще раз или даже в новом вопросе.
Я думаю, вам лучше разделить этот вопрос на 4 * или более * вопросы, потому что ответ (ы), который вы ожидаете, действительно находится в разных областях знаний – mmonem
@mmonem: Я не согласен. 1-3 - вопросы, связанные с XML, и imho, их можно очень хорошо задавать в одном вопросе. – fresskoma