2010-08-26 2 views
0

Я пытаюсь разобрать XML найти на странице ...XML синтаксический анализ с использованием SimpleXML

http://www.rapleaf.com/apidoc/person

Name: Test Dummy 
Age: 42 
gender: Male 
Address: San Francisco, CA, US 
Occupation: 
University: Berkeley 
first seen: 2006-02-23 
last seen: 2008-09-25 
Friends: 42 
Name: 
Age: 
gender: 
Address: 
Occupation: 
University: 
first seen: 
last seen: 
Friends: 

1) Мне пришлось удалить записи, где "&" был найден. Я смог обработать страницу только после этого.

2) Я не мог разобрать «членство на сайте» я не мог разобрать «оккупации»

3) Я получаю 2 записи, когда я жду только один.

4) Как вставить эти записи в базу данных?

<?php 

// displays all the file nodes 
if(!$xml=simplexml_load_file('rapleaf.xml')){ 
    trigger_error('Error reading XML file',E_USER_ERROR); 
} 

foreach($xml as $user){ 
    echo 'Name: '.$user->name. ' 
<br /> Age: '.$user->age.' 
<br /> gender: '.$user->gender.' 
<br /> Address: '.$user->location.' 
<br /> Occupation: '.$user->occupations->occupation->company.' 
<br /> University: '.$user->universities->university.' 
<br /> first seen: '.$user->earliest_known_activity.' 
<br /> last seen: '.$user->latest_known_activity.' 
<br /> Friends: '.$user->num_friends.' 
<br />'; 
} 

?> 
+1

Я думаю, вам лучше разделить этот вопрос на 4 * или более * вопросы, потому что ответ (ы), который вы ожидаете, действительно находится в разных областях знаний – mmonem

+0

@mmonem: Я не согласен. 1-3 - вопросы, связанные с XML, и imho, их можно очень хорошо задавать в одном вопросе. – fresskoma

ответ

0

1. Амперсанды являются частью спецификации синтаксиса XML (они используются для кодирования нестандартных символов). Поэтому они не могут использоваться отдельно в документах XML. Они должны быть закодированы в & или они должны быть заключены в CDATA-блок: http://www.w3schools.com/xmL/xml_cdata.asp.

2. Вы не можете получить доступ к таким дочерним элементам ($ user-> Occupations-> occupation), потому что у элемента есть дочерние элементы. Вы должны сделать что-то вроде:

 
$a = $user->occupations->children(); 
$b = $b->occupation->attributes(); 
$c = (string)$b->company; 

Отъезд http://php.net/manual/de/book.simplexml.php для получения дополнительной информации.

3. Вы получаете две записи, потому что элементы XML всегда имеют корневой элемент, который окружает их детей. Поэтому, когда вы итерации, которые foreach за $ xml, вы сначала получите объект SimpleXMLElement, а затем для. используется как корневой элемент.

4. Это действительно другой вопрос и зависит от того, какую базу данных вы хотите использовать. Google поможет вам в этом. Вероятно, вы захотите использовать MySQL, потому что работаете с php. Так проверьте http://www.google.de/search?sourceid=chrome&ie=UTF-8&q=php+mysql+tutorial :)

1

Чтобы иметь возможность разобрать этот документ (который не очень хорошо сформированный) я бы рекомендовал сделать следующее:

$xmlString = file_get_contents('rapleaf.xml'); 
$xmlString = str_replace('&', '&amp;', $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. Если у вас есть дополнительные вопросы, просто спросите еще раз или даже в новом вопросе.

+0

Я пробовал код с живыми веб-данными через API, и я заметил, что имя сайта отображается, даже если существует = false условие выполнено. Не могли бы вы объяснить, почему это происходит? – shantanuo

+0

Теперь я процитировал «истинное» значение. Проверьте это, это может быть проблема. – 2ndkauboy

Смежные вопросы