Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.09.2006, 19:58
alehano вне форума Посмотреть профиль Отправить личное сообщение для alehano Найти все сообщения от alehano
  № 1  
Ответить с цитированием
alehano

Регистрация: Feb 2006
Сообщений: 6
По умолчанию В php сохраняется только последняя строка xml

Привет. У меня проблема.
Я во флэше сделал форму обратной связи. Из нее отсылается текст в php.
Проблема в том, что в php при обработке xml сохраняется только последняя строка, если вводится несколько строк текста.

Например при вводе.

"Привет.
Пока."

В переменную php присваивается только "Пока."

Ниже привожу код xml обработчика в php.
Он довольно простой. Все что мне от него нужно - сохранить несколько значений из xml в переменные.

Помогите разобраться. Может посоветуете по-другому обрабатывать xml (я в нем еще новичок).

PHP код:
class xml // класс обработки xml
{
    var 
$parser;
    var 
$node;
    var 
$result;

    function 
xml()
    {
        
$this->parser xml_parser_create();

        
xml_set_object($this->parser, &$this);
        
xml_set_element_handler($this->parser"tag_open""tag_close");
        
xml_set_character_data_handler($this->parser"cdata");
    }

    function 
parse($data)
    { 
        
xml_parse($this->parser$data);
        return 
$this->result;
    }

    function 
tag_open($parser$tag$attributes)
    { 
        
    
$this->node=$tag;
    }

    function 
cdata($parser$cdata)
    {

    if(
$this->node && $cdata$this->result[$this->node]=$cdata;
    }

    function 
tag_close($parser$tag)
    {
    
$this->node=null;
    }

    function 
free()
    {
    
xml_parser_free($this->parser);
    
    }

}

/*

в скрипт посылается такой файл:

<xml><data>Привет.
Пока.</data></xml>

*/

// теперь начинается сам код обработки

$xml_file file_get_contents("php://input");

$xml_parser = new xml();
$res_arr=$xml_parser->parse($xml_file);
$xml_parser->free();

$xml_data=$res_arr[data];

// вместо полного текста в $xml_data сохраняется только последняя строка "Пока." 


Последний раз редактировалось alehano; 27.09.2006 в 20:14.
Старый 27.09.2006, 20:29
Samodelkin вне форума Посмотреть профиль Отправить личное сообщение для Samodelkin Найти все сообщения от Samodelkin
  № 2  
Ответить с цитированием
Samodelkin

Регистрация: Jul 2005
Адрес: Москва
Сообщений: 452
Отправить сообщение для Samodelkin с помощью ICQ
Вот налохая статья
http://www.zend.com/php5/articles/php5-xmlphp.php
__________________
Давайте отбросим факты, чтобы увидеть суть

Старый 27.09.2006, 22:22
alehano вне форума Посмотреть профиль Отправить личное сообщение для alehano Найти все сообщения от alehano
  № 3  
Ответить с цитированием
alehano

Регистрация: Feb 2006
Сообщений: 6
Samodelkin, спасибо за ссылку. Но в статье рассматривается PHP5 и XPath. А у меня на хостинге PHP 4. В нем, насколько я знаю использоваие xml не столь развито. Там используется SAX. Мне в общем-то нужнен самый простой функционал - преобразование нескольих тегов в переменные.

Старый 28.09.2006, 01:42
alehano вне форума Посмотреть профиль Отправить личное сообщение для alehano Найти все сообщения от alehano
  № 4  
Ответить с цитированием
alehano

Регистрация: Feb 2006
Сообщений: 6
Вопрос свой снимаю. Нашел в интернете готовую функцию кот. преобразует xml в массив. Она немного побольше моей, но сохраняет и атрибуты. Думаю, не помешает ее выложить здесь.
P.S. Обратите внимание на кодировку. И в моем случе нужно было поставить XML_OPTION_SKIP_WHITE=0.

PHP код:
<?php
function GetXMLTree ($xmldata)
{
    
// we want to know if an error occurs
    
ini_set ('track_errors''1');

    
$xmlreaderror false;

    
$parser xml_parser_create ('ISO-8859-1');
    
xml_parser_set_option ($parserXML_OPTION_SKIP_WHITE1);
    
xml_parser_set_option ($parserXML_OPTION_CASE_FOLDING0);
    if (!
xml_parse_into_struct ($parser$xmldata$vals$index)) {
        
$xmlreaderror true;
        echo 
"error";
    }
    
xml_parser_free ($parser);

    if (!
$xmlreaderror) {
        
$result = array ();
        
$i 0;
        if (isset (
$vals [$i]['attributes']))
            foreach (
array_keys ($vals [$i]['attributes']) as $attkey)
            
$attributes [$attkey] = $vals [$i]['attributes'][$attkey];

        
$result [$vals [$i]['tag']] = array_merge ($attributesGetChildren ($vals$i'open'));
    }

    
ini_set ('track_errors''0');
    return 
$result;
}

function 
GetChildren ($vals, &$i$type)
{
    if (
$type == 'complete') {
        if (isset (
$vals [$i]['value']))
            return (
$vals [$i]['value']);
        else
            return 
'';
    }

    
$children = array (); // Contains node data

    /* Loop through children */
    
while ($vals [++$i]['type'] != 'close') {
        
$type $vals [$i]['type'];
        
// first check if we already have one and need to create an array
        
if (isset ($children [$vals [$i]['tag']])) {
            if (
is_array ($children [$vals [$i]['tag']])) {
                
$temp array_keys ($children [$vals [$i]['tag']]);
                
// there is one of these things already and it is itself an array
                
if (is_string ($temp [0])) {
                    
$a $children [$vals [$i]['tag']];
                    unset (
$children [$vals [$i]['tag']]);
                    
$children [$vals [$i]['tag']][0] = $a;
                }
            } else {
                
$a $children [$vals [$i]['tag']];
                unset (
$children [$vals [$i]['tag']]);
                
$children [$vals [$i]['tag']][0] = $a;
            }

            
$children [$vals [$i]['tag']][] = GetChildren ($vals$i$type);
        } else
            
$children [$vals [$i]['tag']] = GetChildren ($vals$i$type);
        
// I don't think I need attributes but this is how I would do them:
        
if (isset ($vals [$i]['attributes'])) {
            
$attributes = array ();
            foreach (
array_keys ($vals [$i]['attributes']) as $attkey)
            
$attributes [$attkey] = $vals [$i]['attributes'][$attkey];
            
// now check: do we already have an array or a value?
            
if (isset ($children [$vals [$i]['tag']])) {
                
// case where there is an attribute but no value, a complete with an attribute in other words
                
if ($children [$vals [$i]['tag']] == '') {
                    unset (
$children [$vals [$i]['tag']]);
                    
$children [$vals [$i]['tag']] = $attributes;
                }
                
// case where there is an array of identical items with attributes
                
elseif (is_array ($children [$vals [$i]['tag']])) {
                    
$index count ($children [$vals [$i]['tag']]) - 1;
                    
// probably also have to check here whether the individual item is also an array or not or what... all a bit messy
                    
if ($children [$vals [$i]['tag']][$index] == '') {
                        unset (
$children [$vals [$i]['tag']][$index]);
                        
$children [$vals [$i]['tag']][$index] = $attributes;
                    }
                    
$children [$vals [$i]['tag']][$index] = array_merge ($children [$vals [$i]['tag']][$index], $attributes);
                } else {
                    
$value $children [$vals [$i]['tag']];
                    unset (
$children [$vals [$i]['tag']]);
                    
$children [$vals [$i]['tag']]['value'] = $value;
                    
$children [$vals [$i]['tag']] = array_merge ($children [$vals [$i]['tag']], $attributes);
                }
            } else
                
$children [$vals [$i]['tag']] = $attributes;
        }
    }

    return 
$children;
}
$url "http://somedomain.com/test.xml"//URL of the XML FEED

$contents file_get_contents($url);

$data GetXMLTree ($contents);
print_r($data);


?>

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:59.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.