Чтобы иметь возможность разобрать этот документ (который неправильно сформирован), я бы рекомендовал сделать следующее:
$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. Если у вас есть дополнительные вопросы, просто задайте их еще раз или даже в новом вопросе.
person
2ndkauboy
schedule
01.09.2010