Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 11

Обработка xml ответа

24.01.2015, 17:47. Показов 4626. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Для работы приложения необходимо отправить запрос на сервер и обработать ответ, который передается в виде xml. В описании этого приложения предложено использовать форму для передачи данных (именно форму, а не xml-запрос).
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<FORM ACTION="https://zimmer.im-web.de/Schnittstellen/ZiW.php" METHOD=get>
  <INPUT TYPE=HIDDEN NAME="get[search]" VALUE="1">
  <INPUT TYPE=HIDDEN NAME="para[interface_id]" VALUE="200">
  <INPUT TYPE=HIDDEN NAME="para[support_email]" VALUE="info@meineurlhier.de">
  <INPUT TYPE=HIDDEN NAME="para[datestart]" VALUE="20150126">
  <INPUT TYPE=HIDDEN NAME="para[dateend]" VALUE="20150130">
  <INPUT TYPE=HIDDEN NAME="para[adults]" VALUE="1">
  <INPUT TYPE=HIDDEN NAME="para[children][7]" VALUE="2">
  <INPUT TYPE=HIDDEN NAME="para[region][we35bb49064f089]" VALUE="1">
  
  <INPUT  TYPE=SUBMIT  name="submit" VALUE="freie Wohneinheiten/Preise anzeigen">
  </FORM>
Ответ выдается в браузер в xml.

Вопрос состоит в том, как обратиться к этому ответу? Как использовать те данные, которые отображены, которые были получены? Я пробовала использовать функции simplexml, например, simplexml_load_file() и т.д, но это не дает нужного результата. Подскажите, пожалуйста
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2015, 17:47
Ответы с готовыми решениями:

Обработка json или xml ответа из Яндекс метрики
Все токены ID и пароли знаю. Когда вбиваю url с данными получаю ответ от яндекс метрики со статистикой. Он может быть и в json и в xml. Как...

Обработка TSV ответа
Добрый день, получаю ответ в формате TSV. Как спарсить данные и загнать в таблицу? &quot;2017-08-24 (2017-08-22 - 2017-08-24)&quot;...

Обработка ответа с БД в виде XML в PHP
Всем добрый день. Помогите пожалуйста понять как работать с XML Отправляется GET запрос на сервер (например)...

11
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.01.2015, 09:55
Djevanna, может там ещё нужно указать URL страницы на Вашем сайте, куда будет перенаправлен ответ? Если тот сервис такой функции не предоставляет, то можно использовать CURL. Просто передайте все те же данные, которые указываете в форме, с помощью CURL.
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 11
25.01.2015, 12:43  [ТС]
Попробовала через curl. Ничего не выходит.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$data='<get[search]>1</get[search]>
<para[interface_id]>200</para[interface_id]>.....';
$res=curl_init();
curl_setopt($res, CURLOPT_URL,'https://zimmer.im-web.de/Schnittstellen/ZiW.php');
curl_setopt($res, CURLOPT_POST, 1);
curl_setopt($res, CURLOPT_POSTFIELDS, $data);  
curl_setopt($res,CURLOPT_RETURNTRANSFER,true);
$out=curl_exec($res); 
echo $out;
if(!$out) {
        $error = curl_error($res).'('.curl_errno($res).')';
        echo $error;
    }
curl_close($res);
Выводит ошибку "SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:cer tificate verify failed(60)"

Я добавила настройки
PHP
1
2
curl_setopt($res, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($res, CURLOPT_SSL_VERIFYHOST, false);
Теперь выводит просто : (0)
Этот ноль, как я понимаю, уже мой ответ? И, если в описании этого апи предлагают использовать формы для передачи данных, то разве можно использовать curl для этого?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
26.01.2015, 12:41
Цитата Сообщение от Djevanna Посмотреть сообщение
если в описании этого апи предлагают использовать формы для передачи данных, то разве можно использовать curl для этого?
Да, разумеется. С помощью CURL мы можем имитировать запрос из браузера. А переменная $data что в себе такое содержит? Вы неправильно в неё данные записали.
И почему Вы передаёте данные с помощью POST, если в форме "method" указан как "get"?
Попробуйте так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
# Массив данных
$data = array(
    'get'  => array(
        'search' => 1
    ),
    'para' => array(
        'interface_id'  => 200,
        'support_email' => 'info@meineurlhier.de',
        'datestart'     => 20150126,
        'dateend'       => 20150130,
        'adults'        => 1,
        'children'      => array(
            7 => 2
        ),
        'region'        => array(
            'we35bb49064f089' => 1
        )
    )
);
 
# Формируем строку GET-запроса
$query = http_build_query($data);
 
$res = curl_init();
curl_setopt($res, CURLOPT_URL, 'https://zimmer.im-web.de/Schnittstellen/ZiW.php?' . $query);
curl_setopt($res, CURLOPT_RETURNTRANSFER, true);
curl_setopt($res, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($res, CURLOPT_SSL_VERIFYHOST, false);
 
$out=curl_exec($res); 
echo $out;
if(!$out) {
        $error = curl_error($res).'('.curl_errno($res).')';
        echo $error;
    }
curl_close($res);
1
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 11
28.01.2015, 21:54  [ТС]
Спасибо! А возможно ли как-то сделать одновременно два запроса? Если для подачи второго поиска нужны результаты из первого, и эти результаты первого "перехватить"? Или все равно нужно это делать последовательно?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
30.01.2015, 07:01
Ну делать последовательно. Пока Вы не получите результат из первого поиска - не сможете сделать второй. Поэтому нужно будет два запроса.
Только вот эту часть кода дублировать не нужно:
PHP
1
2
3
4
5
6
7
8
9
10
# Формируем строку GET-запроса
$query = http_build_query($data);
 
$res = curl_init();
curl_setopt($res, CURLOPT_URL, 'https://zimmer.im-web.de/Schnittstellen/ZiW.php?' . $query);
curl_setopt($res, CURLOPT_RETURNTRANSFER, true);
curl_setopt($res, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($res, CURLOPT_SSL_VERIFYHOST, false);
 
$out=curl_exec($res);
Можно просто обернуть его в функцию и вызывать эту функцию и для первого и для второго поиска.
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 11
30.01.2015, 21:31  [ТС]
То есть все равно необходима перезагрузка страницы?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
31.01.2015, 06:42
Цитата Сообщение от Djevanna Посмотреть сообщение
То есть все равно необходима перезагрузка страницы?
Вы имеете в виду страницу браузера? Нет, перезагружать не нужно. Один раз запустили - и скрипт получит данные, обработает их и сделает второй запрос.
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 11
31.01.2015, 18:46  [ТС]
Подскажите, как можно отправить другой массив данных без дублирования этих строк:
Цитата Сообщение от lyod Посмотреть сообщение
curl_setopt($res, CURLOPT_URL, 'https://zimmer.im-web.de/Schnittstellen/ZiW.php?' . $query);
$out=curl_exec($res);
Разве это возможно?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
31.01.2015, 20:01
Цитата Сообщение от Djevanna Посмотреть сообщение
Разве это возможно?
Да, если обернуть в функцию этот код.
А URL для обоих запросов один и тот же?
Если да, то вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
# Функция для получения XML-данных
function getXML( $data ){    
    # Если не удалось установить сеанс curl
    if( !$ch = curl_init() )
        # Прерываем работу
        return false;
    
    # Формируем строку GET-запроса
    $query = http_build_query($data);
        
    curl_setopt($ch, CURLOPT_URL, 'https://zimmer.im-web.de/Schnittstellen/ZiW.php?' . $query);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
     
    $result = curl_exec($ch); 
    curl_close($ch);
 
    return 
        simplexml_load_string($result);
}
 
# Массив данных
$data = array(
    'get'  => array(
        'search' => 1
    ),
    'para' => array(
        'interface_id'  => 200,
        'support_email' => 'info@meineurlhier.de',
        'datestart'     => 20150126,
        'dateend'       => 20150130,
        'adults'        => 1,
        'children'      => array(
            7 => 2
        ),
        'region'        => array(
            'we35bb49064f089' => 1
        )
    )
);
 
# Первый запрос - получаем данные
$xml = getXML( $data );
 
# Обрабатываем
# $xml->...
 
# Тут другой массив данных
#...
 
# Второй запрос - получаем данные
$xml = getXML( $data );
0
0 / 0 / 0
Регистрация: 24.01.2015
Сообщений: 11
04.02.2015, 19:55  [ТС]
Спасибо большое! Все работает! А если полученный массив потом считывается через foreach, то можно ли сделать постраничную навигацию? Или нужно использовать for?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
05.02.2015, 08:48
Цитата Сообщение от Djevanna Посмотреть сообщение
А если полученный массив потом считывается через foreach, то можно ли сделать постраничную навигацию? Или нужно использовать for?
Ну вообще лучше сделать отдельный класс постраничной навигации, из массива получать данные для указанной страницы. Я как-то написал класс постраничной навигации. Вот он:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<?php
    /*
    * Класс для генерации постраничной навигации
    */
    class Pagination
    {
        /**
        * 
        * @var Ссылок навигации на страницу
        * 
        */
        private $max = 10;
        
        /**
        * 
        * @var Ключ для GET, в который пишется номер страницы
        * 
        */
        private $index = 'page';
        
        /**
        * 
        * @var Текущий GET-запрос
        * 
        */
        private $query;
        
        /**
        * 
        * @var Текущая страница
        * 
        */
        private $current_page;
        
        /**
        * 
        * @var Общее количество записей
        * 
        */
        private $total; 
        
        /**
        * 
        * @var Записей на страницу
        * 
        */
        private $limit;
        
        /**
        * Запуск необходимых данных для навигации
        * @param integer $total - общее количество записей
        * @param integer $limit - количество записей на страницу
        * 
        * @return
        */
        public function __construct( $total, $limit )
        {
            # Устанавливаем общее количество записей
            $this->total  = $total;
            
            # Устанавливаем количество записей на страницу
            $this->limit  = $limit;
            
            # Устанавливаем количество страниц
            $this->amount = $this->amount();
            
            # Вызываем метод установки текущей страницы
            $this->setCurrentPage();
            
            # Вызываем метод установки текущего GET-запроса
            $this->setQueryString();
        }
        
        /**
        *  Для вывода ссылок
        * 
        * @return HTML-код со ссылками навигации
        */
        public function get()
        {            
            # Для записи ссылок
            $links = null;
            
            # Получаем ограничения для цикла
            $limits = $this->limits();
            
            # Генерируем ссылки
            for($page=$limits[0]; $page<=$limits[1]; $page++)
            {
                # Если текущая это текущая страница
                if($page == $this->current_page)
                    # Обводим жирным
                    $links .= '<b>'. $page .'</b>';
                else
                    # Заносим ссылку
                    $links .= $this->generateHtml($page);
            }
            
            # Если ссылки создались - генерируем "Следующая", "Предыдущая", "Первая", "Последняя"
            if(!is_null( $links ))
            {
                # Если текущая страница не первая
                if($this->current_page > 1){
                    # Создаём ссылку "Предыдущая"
                    $links = $this->generateHtml(1, '&lt;', 'Предыдущая') . $links;
                    
                    # Создаём ссылку "Первая"
                    $links = $this->generateHtml(1, '&lt;&lt;', 'Первая') . $links;
                }
                
                # Если текущая страница не первая
                if($this->current_page < $this->amount){
                    # Создаём ссылку "Следующая"
                    $links .= $this->generateHtml($this->current_page + 1, '&gt;', 'Следующая');  
                    
                    # Создаём ссылку "Следующая"
                    $links .= $this->generateHtml($this->amount, '&gt;&gt;', 'Последняя');  
                }   
            }
            
            # Возвращаем ссылки
            return $links;
        }
        
        /**
        * Для генерации HTML-кода ссылки
        * @param string $query - текущий GET-запрос
        * @param integer $page - номер страницы
        * 
        * @return
        */
        private function generateHtml( $page, $text=null, $title=null ){
            # Если текст ссылки не указан
            if(!$text)
                # Указываем, что текст - цифра страницы
                $text = $page;
                
            # Формируем HTML код ссылки и возвращаем
            return
                '<a href="?'. $this->query .'&'. $this->index .'='. $page .'" title="'. $title .'">'. $text .'</a>';
        }
        
        /**
        *  Для получения, откуда стартовать
        * 
        * @return массив с началом и концом отсчёта
        */
        private function limits()
        {
            # Вычисляем ссылки слева (чтобы активная ссылка была посередине)
            $left = $this->current_page - round($this->max / 2);
 
            # Вычисляем начало отсчёта
            $start = $left > 0 ? $left : 1;                
            
            # Если впереди есть как минимум $this->max страниц
            if($start + $this->max <= $this->amount)
                # Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
                $end = $start > 1 ? $start + $this->max : $this->max;
            else{
                # Конец - общее количество страниц
                $end = $this->amount;
 
                # Начало - минус $this->max от конца
                $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
              
            }
            
            # Возвращаем
            return 
                array( $start, $end );
        }
 
        /**
        * Для установки текущей страницы
        * 
        * @return
        */
        private function setCurrentPage()
        {
            # Получаем номер страницы
            $this->current_page = isset($_GET[$this->index]) ? (int) $_GET[$this->index] : 1;
            
            # Если текущая страница боле нуля
            if($this->current_page > 0)
            {
                # Если текунщая страница меньше общего количества страниц
                if($this->current_page > $this->amount)
                    # Устанавливаем страницу на последнюю
                    $this->current_page = $this->amount;
            }
            else
                # Устанавливаем страницу на первую
                $this->current_page = 1;
        }
        
        /**
        * Для получения и установки текущего GET-запроса
        * 
        * @return
        */
        private function setQueryString(){
            # Получаем параметры текущего запроса
            $query = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_QUERY );
            
            # Разбираем строку запроса
            parse_str( $query, $params );
            
            # Удаляем значение страницы, если есть
            unset( $params[$this->index] );
            
            # Формируем запрос
            $this->query = http_build_query( $params );
        }
        
        /**
        * Для получеия общего числа страниц
        * 
        * @return число страниц
        */
        private function amount()
        {
            # Делим и возвращаем
            return
                ceil( $this->total / $this->limit );
        }
    }

Использовать так:
PHP
1
2
3
4
5
6
7
8
9
10
# Подключаем файл с классом постаничной навигации
    require('pagination.php');
    
    # Создаём экземпляр класса
    # Первый параметр - общее количество элементов.
    # Второй параметр - сколько записей Вы выводите на страницу
    $pagination = new Pagination( 101, 10 );
    
    # Выводим постраничную навигацию
    echo $pagination->get();
Этот класс выводит только саму навигацию. А для вывода данных уже сами, исходя из того, что содержится в $_GET['page'], выводите данные из своего массива. В $_GET['page'] содержится номер страницы, которую нужно показать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2015, 08:48
Помогаю со студенческими работами здесь

Отправка запроса на сервер - получение ответа в xml и обработка
Пожалуйста помогите в решении проболемы. Извините если создаю дубль тем, ну очень нужно найти решение и понять как это работает. ...

Отправка запроса на сервер - получение ответа в xml и обработка
Всем добрый день. Искал по всем форумам и всем блогам, но нужного ответа не нашел и не добился результата. Отправляется Get запрос...

Убрать XML из ответа
Здравствуйте. Asp.Net webService (targetFramework=&quot;4.5.1&quot;) возвращает значение в виде &lt;string...

Обработка структуры и содержимого текста отличного от XML средствами XML
Есть текст, в котором есть структура и ключевые символы придуманные какими-нибудь программистами для своего проекта. Т.е. свой язык....

Чтение XML ответа от сайта
Такой код string ur = string.Format(&quot;http://{0}:{1}/??type=tralala&quot;,IPSRV,WebPort); Uri uri = new Uri(ur); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru