Синтаксический анализ XML с использованием simpleXML - PullRequest
0 голосов
/ 26 августа 2010

Я пытаюсь разобрать найденный на странице XML ...

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 />';
}

?>

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

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

$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);
}

Сначала прочитайте файл в строку, которая заменяет символы амперсанда (в пределахсвязь) со своей сущностью.Вы можете использовать функцию 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.Если у вас есть дополнительные вопросы, просто задайте их еще раз или даже задайте новый вопрос.

0 голосов
/ 30 августа 2010

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

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

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

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

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

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

...