xml_parser - как бы запихнуть данные в базу

apollox

Новичок
xml_parser - как бы запихнуть данные в базу

С XMLReader() не получилось, пробую xml_parser_create()
Задача все та же - вытащить и положить в базу курсы валют. Вот код

PHP:
$file = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=15/05/2006&date_req2=01/07/2006&VAL_NM_RQ=R01235";


function characterhandler($parser, $data)
{
    echo $data."<br>";
}

function startElement($parser, $name, $attrs) 
{
    if ($name == "RECORD") echo $attrs["DATE"]." - ".$attrs["ID"]."<br>";
}

function endElement($parser, $name) {
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterhandler");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
  xml_parser_free($xml_parser);
Я хочу в цикле получать четверки значений дата - код валюты - номинал - курс и затем класть в базу.
Но получается ерунда :(
 

bkonst

.. хочется странного?...
Когда получается ерунда, хорошо бы эту ерунду описать. И задать конкретный вопрос.
 

apollox

Новичок
Автор оригинала: bkonst
Когда получается ерунда, хорошо бы эту ерунду описать. И задать конкретный вопрос.
В броузере получается так:

16.05.2006 - R01235
1
26,9187
17.05.2006 - R01235
1
27,0209
...

Я же хочу получать в цикле:
16.05.2006 R01235 1 26,9187 - запись в базу
и так далее

Я не понимаю, каким образом можно получить в таком виде значения, потому как атрибуты достает одна функция, значения, причем все - другая.
 

bkonst

.. хочется странного?...
Например, создать глобальную переменную - контекст, в которую сохранять полученные на текущий данные и тэг, который сейчас обрабатывается - состояние. Поведение characterhandler должно зависеть от контекста.

Когда получаешь закрывающий тэг </Record> - записываешь данные, сохраненные в контексте и очищаешь его.
 

apollox

Новичок
Автор оригинала: bkonst
Например, создать глобальную переменную - контекст, в которую сохранять полученные на текущий данные и тэг, который сейчас обрабатывается - состояние. Поведение characterhandler должно зависеть от контекста.

Когда получаешь закрывающий тэг </Record> - записываешь данные, сохраненные в контексте и очищаешь его.
Если несложно, можно показать, в каком именно месте приведенного кода должны вставляться эти обработки? Что внутри функции и что - в цикле while ?
 

bkonst

.. хочется странного?...
Все обработки будут вызываться из characterhandler/startElement/endElement.

endElement - при получении /Record сохраняет контекст в базу и очищает его.
startElement - запоминает текущий тэг в контексте, по необходимости сохраняет значения атрибутов там же.
characterhandler - смотрит на текущий тэг из контекста и в зависимости от него сохраняет символьные данные.
 
Сверху