Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > XML vs БД


Автор: localhost 1.8.2012, 16:34
Всем доброго дня. В веб-технологиях я весьма дилетант, поэтому хочу спросить помощи у любимого форума.
Преамбула: есть простой клиент на PHP, который обращается к другому удаленному скрипту и получает от него данные в XML-формате.
Пример:
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<routes>
    <bus>
        <number></number>
        <driver></driver>
<!-- Тут еще ряд параметров, для краткости их опускаю --!>
            <schedule date="2012-07-31">a:34:{i:0;s:6:" 09:00";i:1;s:6:" 14:00";i:2;s:6:" 19:10";i:3;s:6:" 00:10";i:4;s:6:" 20:30";i:5;s:6:" 22:50";i:6;s:6:" 01:30";i:7;s:6:" 23:05";i:8;s:6:" 13:00";i:9;s:6:" 13:30";i:10;s:6:" 14:35";i:11;s:6:" 15:00";i:12;s:6:" 15:30";i:13;s:6:" 16:00";i:14;s:6:" 16:30";i:15;s:6:" 17:00";i:16;s:6:" 17:35";i:17;s:6:" 18:00";i:18;s:6:" 18:30";i:19;s:6:" 19:00";i:20;s:6:" 19:30";i:21;s:6:" 21:00";i:22;s:6:" 21:30";i:23;s:6:" 22:00";i:24;s:6:" 22:30";i:25;s:6:" 00:00";i:26;s:6:" 00:30";i:27;s:6:" 01:00";</schedule>
            <schedule date="2012-08-01">a:34:{i:0;s:6:" 09:00";i:1;s:6:" 14:00";i:2;s:6:" 19:10";i:3;s:6:" 00:10";i:4;s:6:" 20:30";i:5;s:6:" 22:50";i:6;s:6:" 01:30";i:7;s:6:" 23:05";i:8;s:6:" 13:00";i:9;s:6:" 13:30";i:10;s:6:" 14:35";i:11;s:6:" 15:00";i:12;s:6:" 15:30";i:13;s:6:" 16:00";i:14;s:6:" 16:30";i:15;s:6:" 17:00";i:16;s:6:" 17:35";i:17;s:6:" 18:00";i:18;s:6:" 18:30";i:19;s:6:" 19:00";i:20;s:6:" 19:30";i:21;s:6:" 21:00";i:22;s:6:" 21:30";i:23;s:6:" 22:00";i:24;s:6:" 22:30";i:25;s:6:" 00:00";i:26;s:6:" 00:30";i:27;s:6:" 01:00";</schedule>
            <schedule date="2012-08-02">a:2:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";}</schedule>
            <schedule date="2012-08-03">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-04">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-05">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-06">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-07">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-08">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
    </bus>


Примерно так. Значения "schedule" - время отправления автобуса в виде сериализованного массива. XML-файл обновляется ежедневно.
Амбула. Я использую шаблонизатор Twig. Для вывода общей информации по рейсам (без расписания). Я в принципе могу без проблем использовать SimplXMLElement и в цикле выводить данные.
Проблема: в том, что надо сделать кликабельным маршрут, перейдя по ссылке на который можно увидеть расписание и другие параметры.
Запутался уже как лучше сделать. В исходном XML нет урла. Думал, что в шаблоне генерировать урл, а потом разбирать его, подгружать нужный шаблон, но непонятно как теперь выводить инфу именно по данному маршруту? Либо запихивать все в базу и огород городить с несколькими таблицами.

Может подскажете как проще поступить? Опыта не хватает smile

Автор: Sanchezzz 1.8.2012, 17:02
в xml есть xpath можно составить запрос в виде УРЛ и выбрать нужную запись по условию

Опишите что есть к чему можно прицепится.

я вижу ток дату 

Автор: localhost 1.8.2012, 19:56
Sanchezzz, благодарю за ответ
Цитата(Sanchezzz @  1.8.2012,  17:02 Найти цитируемый пост)
Опишите что есть к чему можно прицепится.

я вижу ток дату 


Можно прицепиться, например, к <number>
Тег:
Код

<number>531-Б</number>

Соответственнно, урл вида www.domain.tld/routes/531-b

Автор: Sanchezzz 1.8.2012, 21:34
child::routes/child::bus/child::number[text()="531-Б"]

Автор: localhost 2.8.2012, 12:03
Sanchezzz, ага, т.е. это будет использоваться примерно так:
Код

$route = new SimpleXMLElement($xml_file, NULL, TRUE);
$data = $route->xpath("child::routes/child::bus/child::number[text()='{$href}'] ");

И в $data будет нужный мне массив. Так я понимаю? smile

Автор: Sanchezzz 2.8.2012, 12:09
Цитата

И в $data будет нужный мне массив. Так я понимаю?
 ДА, прочитайте документацию про Xpath на википедииии есть все команды на русском языке более гуманная дока.
Тока вам нужно будет сделать на один уровень назад вроде /../ 


Автор: localhost 2.8.2012, 12:15
Sanchezzz, спасибо за наводку, будем изучать smile

Добавлено через 7 минут и 22 секунды
Все, сделал, только у меня xpath такой получился:
Код

"/routes/bus[number='{$href}']"

Автор: Evghenusi 2.8.2012, 14:38
localhost, а без xml не обойтись?
я вижу сериализованные массивы, нельзя сделать один общий и избавиться от xml?
тогда SimplXMLElement не понадобится

Автор: localhost 2.8.2012, 15:04
Evghenusi, думаю, так тоже можно, спасибо smile 

Кстати, я что-то не совсем так сделал, потому что в возвращаемом массиве "теряется" значение атрибута date тега schedule:
Было 
Код

            <schedule date="2012-08-02">a:2:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";}</schedule>
            <schedule date="2012-08-03">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-04">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-05">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-06">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-07">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>
            <schedule date="2012-08-08">a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}</schedule>


Превратилось в:

Код

[schedule] => Array
                (
                    [0] => a:2:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";}
                    [1] => a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}
                    [2] => a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}
                    [3] => a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}
                    [4] => a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}
                    [5] => a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}
                    [6] => a:3:{i:0;s:6:" 11:10";i:1;s:6:" 20:30";i:2;s:6:" 16:10";}
                )


Можно от этого как-нибудь избавиться? Как-нибудь получать ассоциированный массив вида [дата] => [значение]?

Автор: Evghenusi 2.8.2012, 19:26
Цитата(localhost @  2.8.2012,  15:04 Найти цитируемый пост)
Evghenusi, думаю, так тоже можно, спасибо smile 

тогда почему дальше ковыряешься в SimplXMLElement ?

ты сериализованный массив получил, преобразовал его в массив и вуаля.
зачем эти танцы с бубном?

Добавлено @ 19:27
кстати, для "полноты картины" добавь JSON))

Автор: localhost 2.8.2012, 19:42
Цитата(Evghenusi @  2.8.2012,  19:26 Найти цитируемый пост)
тогда почему дальше ковыряешься в SimplXMLElement ?

Так я данные в XML получаю. Из другого места. Мне с ними и надо работать.
А в сериализованном виде передается массив времен на дату, которая является атрибутом XML-тега schedule. Всего лишь.

Цитата(Evghenusi @  2.8.2012,  19:26 Найти цитируемый пост)
кстати, для "полноты картины" добавь JSON)) 

Нет, мне все это очень интересно, конечно, буду изучать постепенно, но не в этот раз, все-таки smile

Автор: Evghenusi 2.8.2012, 19:45
localhost, подумал что входные данные тоже ты формируешь ... пардон(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)