Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> взаимодействие php и xml 
:(
    Опции темы
Aliance
  Дата 5.5.2005, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Доброго времени суток.
Интересует такой вопрос: как осуществлять вывод на страничку. читая данные из файла xml.
С помощью Js это легко (получаем ссылку на файл, читаем все теги по имени или айди и выводим их value). НО есть одно НО - код доступен всем. А я хочу его скрыть - значит нужно использовать php.
Например, есть файл colors.xml, там:
Код

<xml...>
<text>
   <colors>
      <color1>1</colors>
      <color2>2</colors>
   </colors>

   <colors>
      <color1>3</colors>
      <color2>4</colors>
   </colors>
</text>
....

Как вывести на экран такое:
Код

1
2
3
4

PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 5.5.2005, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 3
Всего: 53



не проверял ...
Код

$fpath = 'colors.xml';
$fcontent = implode('', file($fpath));

$p = xml_parser_create();
xml_parse_into_struct($p, $fcontent, $values, $indexes);
$colors = array();
foreach ($values as $value) {
    if (preg_match('/^color[0-9]+$/', $value['tag']) && $value['type'] == 'complete') {
        array_push($colors, $value['value']);
    }
}
xml_parser_free($p);


Это сообщение отредактировал(а) Irokez - 5.5.2005, 22:49
PM   Вверх
Aliance
Дата 5.5.2005, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Нет, не очень подойдет...
Цитата(Irokez @ 5.5.2005, 23:48)
color[0-9]

А если их у меня больше - придется менять код?

Нет ли стандартного шаблона...

PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 5.5.2005, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 3
Всего: 53



Цитата(Aliance @ 5.5.2005, 22:50)
А если их у меня больше - придется менять код?

всмысле больше?
пойдут любые теги типа 'color315...13'
PM   Вверх
Aliance
Дата 5.5.2005, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Ну если теги по другому называются, или нужно обратиться, скажем, к тегу color2 во ВТОРОМ блоке тегов colors...
Нельзя ли обратиться как-нить по позиции тега, скажем так:
1-2-2 (т.е. text -> colors -> color2)
PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 6.5.2005, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 3
Всего: 53



выдрал из одного проекта..
функция принимает адрес xml файла, а выдает структуру в виде многомерного ассоциативного массива
Код

function xparse_xml_file($fpath)
{
    $fcontent=file_get_contents($fpath);
    $parser=xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, $fcontent, $values, $tags);
    $error=xml_get_error_code($parser);
    if($error)
    {
        $column=xml_get_current_column_number($parser);
        $line=xml_get_current_line_number($parser);
        $byte=xml_get_current_byte_index($parser);
        echo xml_error_string($error).' at line: '.$line.', column: '.$column.', byte: '.$byte."\n";
    }
    xml_parser_free($parser);
    $keys=array();
    $name='ini';
    foreach($values as $tag)
    {
        switch($tag['type'])
        {
            case 'open':
            case 'complete':
                array_push($keys, $tag['tag']);
                $e=&$$name;
                $last=array_pop($keys);
                foreach($keys as $key) $e=&$e[$key];
                array_push($keys, $last);
                if(isset($e[$last]))
                {
                    $last_k=(is_array($e[$last])) ? max(array_keys($e[$last])) : '';
                    if(!is_int($last_k))
                    {
                        $e=&$e[$last];
                        $b=$e;
                        $last=1;
                        $last_k=1;
                        $e=null;
                        $e[$last]=$b;
                    }
                    else $e=&$e[$last];
                    $last=$last_k+1;
                    array_push($keys, $last);
                }
                if($tag['type']=='complete')
                {
                    if(isset($tag['value']))
                    {
                        $e[$last]=$tag['value'];
                    }
                    else $e[$last]=null;
                    if(is_int(end($keys))) array_pop($keys);
                    array_pop($keys);
                }
                break;
            case 'close':
                if(is_int(end($keys))) array_pop($keys);
                array_pop($keys);
                break;
        }
    }
    return($ini);
}

PM   Вверх
Aliance
Дата 6.5.2005, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Вау, спс. А как с ней работать только? smile
PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 6.5.2005, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 3
Всего: 53



создаешь XML файл, в него записываешь к примеру:
Код

<?xml version="1.0"?>
<text>
   <colors>
      <color1>1</color1>
      <color2>2</color2>
   </colors>

   <colors>
      <color1>3</color1>
      <color2>4</color2>
   </colors>
</text>

потом функции передаешь путь к файлу:
Код

$ini = xparse_xml_file('test.txt');
echo '<pre>'.print_r($ini, 1).'</pre>';

вывод будет примерно такой:
Код

Array
(
    [text] => Array
        (
            [colors] => Array
                (
                    [1] => Array
                        (
                            [color1] => 1
                            [color2] => 2
                        )

                    [2] => Array
                        (
                            [color1] => 3
                            [color2] => 4
                        )

                )

        )

)

PM   Вверх
Aliance
Дата 6.5.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: нет
Всего: 137



Цитата(Irokez @ 6.5.2005, 17:08)
$ini = xparse_xml_file('test.txt');

А почему txt, а не xml?
PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 6.5.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 3
Всего: 53



Цитата(Aliance @ 6.5.2005, 19:00)
А почему txt, а не xml?

а какая разница smile
PM   Вверх
trofusha
Дата 15.12.2005, 12:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











респект и уважуха оч выручила функция и меня
  Вверх
yalo
Дата 16.1.2007, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 24.5.2006

Репутация: нет
Всего: 2



от меня также спасибо за функцию большое, есть только вопрос одни по поводу кодировки - мой xml-файл создается в кодировке UTF-8, в результате вместо русских букв в выводящемся массиве одни ????
если сохраняю в cp-1251, то кодировка не теряется.. как-то можно это отрегулировать?
PM MAIL ICQ   Вверх
ximik
  Дата 11.4.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 19.6.2006

Репутация: нет
Всего: нет



спасибо за функцию!
А что если есть такая конструкция

Код

<TEMPERATURE max="10" min="8" /> 


то как мне получить значение max ? Потому что вот что мне оно выдает
 [TEMPERATURE] => 




PM MAIL   Вверх
Platon
Дата 27.10.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



ыыы, бьюсь об заклад, это вырвано из гисметео xml, я сам там с этим вопросом попал ^_^
Вот моя измененная версия кода Irokez'a

Код

<?php
function xparse_xml($fcontent)
{
    $parser=xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, $fcontent, $values, $tags);
    $error=xml_get_error_code($parser);
    if($error)
    {
        $column=xml_get_current_column_number($parser);
        $line=xml_get_current_line_number($parser);
        $byte=xml_get_current_byte_index($parser);
        trigger_error(xml_error_string($error).' at line: '.$line.', column: '.$column.', byte: '.$byte, E_USER_ERROR);
    }
    xml_parser_free($parser);
    $keys=array();
    $name='ini';
    foreach($values as $tag)
    {
        switch($tag['type'])
        {
            case 'open':
            case 'complete':
                array_push($keys, $tag['tag']);
                $e=&$$name;
                $last=array_pop($keys);
                foreach($keys as $key) $e=&$e[$key];
                array_push($keys, $last);
                if(isset($e[$last]))
                {
                    $last_k=(is_array($e[$last])) ? max(array_keys($e[$last])) : '';
                    if(!is_int($last_k))
                    {
                        $e=&$e[$last];
                        $b=$e;
                        $last=1;
                        $last_k=1;
                        $e=null;
                        $e[$last]=$b;
                    }
                    else $e=&$e[$last];
                    $last=$last_k+1;
                    array_push($keys, $last);
                }
                if($tag['type']=='complete')
                {
                 if (isset($tag['value'])) {
                        $e[$last]=$tag['value'];
                    }
                    else $e[$last]=null;
                    if(is_int(end($keys))) array_pop($keys);
                    array_pop($keys);
                } 
                if (isset($tag["attributes"])) {
                     $e[$last]["attributes"] = $tag["attributes"];
                }
                break;
            case 'close':
                if(is_int(end($keys))) array_pop($keys);
                array_pop($keys);
                break;
        }
    }
    return($ini);
}
?>


Учтите, в моем коде на входе функции не путь к файлу, а содержимое, т.е. xml код.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: X технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.