Не получается получить содержимое

garlian

Новичок
Не получается получить содержимое

Есть xml файл : http://api.torment.ru/clan.pl?api_code=fTzre9B9rjrGAkUDq7eWZhmD8nd8D1&clan=God+Messengers
Нужно получить его содержимое, особенно то что в USERNAME_HTML.
Вот код, но почему-то массив $members возвращает пустое значени, я не пойму где ошибка?
PHP:
<?php
$members = array();
$currentMember = null;
$index = null;
function saxStartElement($parser,$name,$attrs)
{
    global $currentMember,$index;
    switch($name)
    {
        case 'members':
            $members = array();
            break;
        case 'user':
            $currentMember = array();
            if (in_array('id',array_keys($attrs)))
                $currentMember['id'] = $attrs['id'];
            break;
        default:
            $index = $name;
            break;
    };
}
function saxEndElement($parser,$name)
{
    global $members,$currentMember,$index;
    if ((is_array($currentMember)) && ($name=='id'))
    {
        $members[] = $currentMember['id'];
        $currentMember = null;
    };
    $index = null;
}

function saxCharacterData($parser,$data)
{
    global $currentMember,$index;
    if ((is_array($currentMember)) && ($index))
        $currentMember[$index] = $data;
}

$parser = xml_parser_create();
xml_set_element_handler($parser,'saxStartElement','saxEndElement');
xml_set_character_data_handler($parser,'saxCharacterData');
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,false);
$xml = join('',file('http://api.torment.ru/clan.pl?api_code=fTzre9B9rjrGAkUDq7eWZhmD8nd8D1&clan=God+Messengers'));
if (!xml_parse($parser,$xml,true))
    die(sprintf('Ошибка XML: %s в строке %d',
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
xml_parser_free($parser);
print_r($members);
?>
Кто в этом понимает, откликнитесь пожалуйста!
 

slach

Новичок
судя по всему ты сильно путаешь понятия атрибута и элемента, и путаешься когда и какой метод вызывается
вот этот кусок кода

if ((is_array($currentMember)) && ($name=='id'))
{
$members[] = $currentMember['id'];
$currentMember = null;

в endElement

какое может быть $name=='id' тут ? если $name это имя закрываемого тега который например username_html !?
судя по XML коду у тебя ТЕГА <id> нету!

код я тебе писать и правит не буду, а SAX модель тебе попробую расжевать

условно есть три типа событий на которые ты вещаешь свои ф-ции обработчики, вызываются они по мере обработки документа (именно поэтому SAX парсинг не очень подходит для СЛОЖНЫХ древовидных структур данных, всю рекурсию элементов приходится во вспомогательных структурах данных держать)


* начало элемента - ТЕГА, а не атрибута

* середина элемента - может вызываться НЕСКОЛЬКО РАЗ во время парсинга содержимого ОДНОГО элемента

поэтому я обычно использую переменную глобальную. (а-ля твое $name) где храню имя тэга,
и еще одну переменную \ массив которая хранит текстовое

* конец элемента - в этот момент самое время ЗАПИСАТЬ те данные которые успели накопиться в результате множественных вызовов $cdata

повторюсь, начало елемента и конец елемента стартуют по ТЕГАМ, не по атрибутам и не по текстовым нодам... в этом IMHO твоя главная ошибка...
 
Сверху