Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка xml / 25 сообщений из 30, страница 1 из 2
12.02.2013, 16:03
    #38148049
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Комрады, добрый (уже наверное) вечер!
Проблема...
В результате отправки на некий веб-сервис GET запроса получаю ответ в формате xml.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    Set http = CreateObject("Microsoft.XMLHTTP")
    http.Open "GET", "sitename" & _
       "chiefId=" & strChief_id & _
       "&authKey=" & strAuthkey & _
       "&protocol=xml" & _
       "&method=Site.ChatHistory" & _
       "&data[date_begin]=" & Format(dtDateFrom, "yyyy-mm-dd") & _
       "&data[date_end]=" & Format(dtDateEnd, "yyyy-mm-dd") & _
       "&data[site_id]=" & strSiteId, False
    http.send
    Range("E14").Select
    ActiveCell.FormulaR1C1 = http.responseText


Поскольку такой вот я лузер, не умею иначе, как поместить этот блок текста в ячейку, а затем парсю содержимое этой ячейки, разнося данные по таблице
Код: plaintext
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.
Sub Get_ChatHistory_parser() 'парсинг xml истории чатов
    Dim strXML As String
    Dim xmlParser As Object
    Dim xmlNode As Object
    Dim xmlNodeList As Object
    Dim xml_path As String

    Set xmlParser = CreateObject("Msxml2.DOMDocument")
    strXML = Range("E14").Value
    Sheets("История чатов").Select
 
    If Not xmlParser.LoadXML(strXML) Then
        MsgBox "Отсутствует xml !"
        Exit Sub
    End If
 
    xml_path = "/values/response/response/*"
    Set xmlNodeList = xmlParser.DocumentElement.SelectNodes(xml_path)
    For Each xmlNode In xmlNodeList
       Debug.Print xmlNode.nodeName, xmlNode.Text
        ActiveCell.FormulaR1C1 = xmlNode.Text
        If xmlNode.nodeName = "referrer" Then
        ActiveCell.Offset(1, -16).Select
        Else: ActiveCell.Offset(0, 1).Select
        End If
    Next
    Set xmlParser = Nothing
End Sub


Беда пришла внезапно... При определенных запросах xmlParser.LoadXML(strXML) не распознавался, как xml. Догадка следствия в том, что количество символов в возвращаемом запросе больше количества, разрешенного excel для записи в ячейку, из-за чего "ломается" структура xml-файла.
Подскажите, как быть?
Пробовал тупо сохранять ответ в переменную и парсить ее, но, видимо, формат xml в ней тоже некорректно сохраняется. Или я не так это делаю.
_____________________
А что на самом деле хотел сказать "Frost_Imp" никто не знает, так как администрация форума попросила его быть вежливым.
...
Рейтинг: 0 / 0
12.02.2013, 16:06
    #38148054
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
В http.responseXML должен быть уже готовый к использованию DOMDocument.
...
Рейтинг: 0 / 0
12.02.2013, 16:11
    #38148065
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
сохраняйте в переменную при загрузке из веб и сразу анализируйте
...
Рейтинг: 0 / 0
12.02.2013, 16:55
    #38148165
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Konst_Oneсохраняйте в переменную при загрузке из веб и сразу анализируйте
Вот в том то и дело, что не получается
Если я предыдущем коде вместо
Код: vbnet
1.
2.
3.
    http.send
    Range("E14").Select
    ActiveCell.FormulaR1C1 = http.responseText


сделаю
Код: vbnet
1.
2.
    http.send
    strXML = http.responseText


а потом в другой процедуре
Код: vbnet
1.
2.
3.
4.
    If Not xmlParser.LoadXML(strXML) Then
        MsgBox "Отсутствует xml !"
        Exit Sub
    End If


я получаю MsgBox
strXML объявлен глобально как Boolean (при String тоже не получалось)
...
Рейтинг: 0 / 0
12.02.2013, 17:02
    #38148179
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
ActiveCell.FormulaR1C1 = http.responseText

зачем так???
берите сразу responseXML и обрабатывайте
...
Рейтинг: 0 / 0
12.02.2013, 17:08
    #38148191
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Konst_One,
нет-нет, первый кусок кода из трех в предыдущем посте - это как БЫЛО. Второй - как СТАЛО.
То есть
Код: vbnet
1.
2.
3.
4.
5.
    http.send
'   Debug.Print http.responseText
'   Range("E14").Select
'   ActiveCell.FormulaR1C1 = http.responseText
    strXML = http.responseText
...
Рейтинг: 0 / 0
12.02.2013, 17:16
    #38148205
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Описываю действия по порядку.
1. Выполняю GET запрос
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub Get_ChatStat_xml() 
    strSiteId = Range("B1").Value 'id сайта. не меняется
    strChief_id = Range("B5").Value
    strAuthkey = Range("B6").Value
    Set http = CreateObject("Microsoft.XMLHTTP")
    http.Open "GET", "sitename" & _
       "chiefId=" & strChief_id & _
       "&authKey=" & strAuthkey & _
       "&protocol=xml" & _
       "&method=Site.ChatStat" & _
       "&data[date_begin]=" & Format(dtDateFrom, "yyyy-mm-dd") & _
       "&data[date_end]=" & Format(dtDateEnd, "yyyy-mm-dd") & _
       "&data[site_id]=" & strSiteId, False
    http.send
    strXML = http.responseText
    Debug.Print strXML

    Set http = Nothing
    strSiteId = ""
    strChief_id = ""
    strAuthkey = ""
    Get_ChatStat_parser
End Sub


2. Пробую парсить
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub Get_ChatStat_parser()
    Dim strXML As String
    Dim xmlParser As Object
    Dim xmlNode As Object
    Dim xmlNodeList As Object
    Dim xml_path As String
    Set xmlParser = CreateObject("Msxml2.DOMDocument")
    If Not xmlParser.LoadXML(strXML) Then
        MsgBox "Ахтунг !"
        Exit Sub
    End If
.....


И гарантированно вижу Ахтунг
Debug.Print strXML такой
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0"?>
<values>
  <error>0</error>
  <response>
    <response>
      <count>35</count>
      <lost>2</lost>
      <average>19</average>
      <positive>15</positive>
      <negative>0</negative>
    </response>
  </response>
</values>
...
Рейтинг: 0 / 0
12.02.2013, 17:20
    #38148216
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
зачем строку то?

я ж говорю про xml

Код: vbnet
1.
2.
3.
Dim doc as Object 'domdocument

Set doc = http.responseXML




а проверку делай через status и ошибку смотри
...
Рейтинг: 0 / 0
12.02.2013, 17:25
    #38148236
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Жутко не хочется казаться нерадивым студентом, но... Что есть status? Чуть подробнее, я сам докурю
...
Рейтинг: 0 / 0
12.02.2013, 17:28
    #38148243
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
свойство у твоего объекта http

Код: vbnet
1.
2.
3.
4.
5.
6.
If http.Status = 200 Then
	'тут есть ответ
	'можно обрабатывать
Else
	'тут проблемы какие-то с ответом
End if
...
Рейтинг: 0 / 0
12.02.2013, 17:31
    #38148261
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Бррр, а какое свойство можно проверить у блока текста в xml
...
Рейтинг: 0 / 0
12.02.2013, 17:32
    #38148265
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
parserError
...
Рейтинг: 0 / 0
12.02.2013, 17:34
    #38148269
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
parseError
очепятка выше
...
Рейтинг: 0 / 0
12.02.2013, 17:34
    #38148272
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Все равно не понимаю ваши односложные ответы :)
Отстаю. Спасибо.
...
Рейтинг: 0 / 0
12.02.2013, 17:41
    #38148288
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
0,5к деревянных банковским переводом за готовый кусок кода :(
...
Рейтинг: 0 / 0
12.02.2013, 17:42
    #38148291
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
...
http.send

If http.Status = 200 Then
'тут есть ответ
'можно обрабатывать

Dim doc as Object 'domdocument

Set doc = http.responseXML 'объект xml
if doc.parseError.errorCode <> 0 then
'ошибка в xml
Debug.Print doc.parseError.reason
else
'бежим по нодам
Dim n as Object
for each n in doc.selectNodes("path")
...
next
end if


Else
'тут проблемы какие-то с ответом
End if
...
Рейтинг: 0 / 0
12.02.2013, 17:48
    #38148310
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Вот-вот, как раз хотел написать, что
Код: vbnet
1.
2.
    Set doc = http.responseXML
    Debug.Print doc.parseError.ErrorCode


выдает 0
...
Рейтинг: 0 / 0
12.02.2013, 17:49
    #38148313
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
вот и хорошо
дальше смотрите что там у вас в нодах.
я бы посоветовал в референсы добавить MSXML и явно объявить все объекты.
...
Рейтинг: 0 / 0
12.02.2013, 17:59
    #38148339
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
...
Рейтинг: 0 / 0
12.02.2013, 18:03
    #38148343
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
...
Рейтинг: 0 / 0
12.02.2013, 18:29
    #38148386
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Konst_One http://www.sql.ru/articles/mssql/03102702xmlin20minutes.shtml
Зачитался. Но на самом интересном месте все закончилось ( Нда, не "xml для чайников" конечно
...
Рейтинг: 0 / 0
12.02.2013, 18:36
    #38148396
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
ну так что у вас там с коллекцией вашей?

Код: vbnet
1.
2.
3.
4.
5.
6.
...
Dim n as MSXML2.IXMLDOMNode
   xml_path = "//values/response/response/*"
   for each n in doc.SelectNodes(xml_path)
	Debug.Print n.Text
   next
...
Рейтинг: 0 / 0
12.02.2013, 18:38
    #38148400
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
тут разжёвано на примере получения курсов с сайта ЦБ применительно к акцесу
http://www.cyberforum.ru/ms-access/thread444017.html
...
Рейтинг: 0 / 0
12.02.2013, 18:58
    #38148427
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Konst_One, дружище, огромное спасибо за инициативу! Честно, благодарен. Но, черт побери, уже сломал все, что работало. Сейчас мысли в кучу соберу...
...
Рейтинг: 0 / 0
12.02.2013, 19:36
    #38148454
Frost_Imp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обработка xml
Я вообще не знаю что делать.
Итак, переменная замечательно передается из функции в функцию.
Ошибка Object variable or With block variable not set появляется на строке
Set xmlNodeList = xmlParser.DocumentElement.SelectNodes(xml_path)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    xml_path = "/values/response/response/*"
    Set xmlNodeList = xmlParser.DocumentElement.SelectNodes(xml_path)
    For Each xmlNode In xmlNodeList
       Debug.Print xmlNode.nodeName, xmlNode.Text
        ActiveCell.FormulaR1C1 = xmlNode.Text
        If xmlNode.nodeName = "referrer" Then
        ActiveCell.Offset(1, -16).Select
        Else: ActiveCell.Offset(0, 1).Select
        End If
    Next
    Set xmlParser = Nothing


....
Что описывает xml_path? После каких тэгов искать ноды?...
Я на что еще обратил внимание... Когда я делаю Debug.Print http.responseText - я не вижу начала блока данных. То есть вместо привычного
Код: xml
1.
2.
3.
4.
<?xml version="1.0"?>
<values>
  <error>0</error>
  <response>


массив данных начинается с
Код: xml
1.
2.
3.
4.
      <city>Kazan</city>
      <group>1</group>
      <message>46679425</message>
      <count>14</count>


Я грешу, что слишком много символов и в окно immediate все данные попросту не влазят. Или в этом и есть ошибка? В том, что, по каким-то причинам, возвращается часть данных и, соответственно, получается уже не xml формат (без начальных то тэгов)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка xml / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]