Чтобы иметь возможность анализировать этот документ (который плохо сформирован), я бы рекомендовал сделать следующее:
$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);
}
Сначала прочитайте файл в строку, которая заменяет символы амперсанда (в пределахсвязь) со своей сущностью.Вы можете использовать функцию simplexml_load_file () для создания объекта xml.
Теперь вы можете анализировать документ.Насколько я вижу, в каждом файле только один человек.Так что вам не нужен цикл foreach.Но вы можете разобрать все поля, вам просто нужно знать как.Вот несколько более сложных примеров разбора разных вещей разными методами:
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;
Чтобы получитьзначение атрибута тега, используйте функцию attribute ().Вам не нужно приводить его на этот раз:
echo 'Occupation: '.$xml->occupations->occupation[0]->attributes()->title;
Как видите, вы также можете получить определенный дочерний узел, так как все дочерние узлы хранятся в массиве.Просто используйте индекс.Если вам нужен только один дочерний узел, вам не нужно использовать цикл для этого.
Но вы всегда должны убедиться, что элемент, на котором вы используете функцию attirbutes (), действителен, иначеошибка будет брошена.Поэтому, возможно, вы захотите проверить это с помощью isset ().
Надеюсь, теперь у вас есть идея о том, как анализировать некоторые XML с помощью SimpleXML.Если у вас есть дополнительные вопросы, просто задайте их еще раз или даже задайте новый вопрос.