powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка xml
25 сообщений из 30, страница 1 из 2
Обработка xml
    #38148049
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Комрады, добрый (уже наверное) вечер!
Проблема...
В результате отправки на некий веб-сервис 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
Обработка xml
    #38148054
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В http.responseXML должен быть уже готовый к использованию DOMDocument.
...
Рейтинг: 0 / 0
Обработка xml
    #38148065
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сохраняйте в переменную при загрузке из веб и сразу анализируйте
...
Рейтинг: 0 / 0
Обработка xml
    #38148165
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обработка xml
    #38148179
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ActiveCell.FormulaR1C1 = http.responseText

зачем так???
берите сразу responseXML и обрабатывайте
...
Рейтинг: 0 / 0
Обработка xml
    #38148191
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Обработка xml
    #38148205
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Описываю действия по порядку.
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
Обработка xml
    #38148216
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем строку то?

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

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

Set doc = http.responseXML




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

Код: vbnet
1.
2.
3.
4.
5.
6.
If http.Status = 200 Then
	'тут есть ответ
	'можно обрабатывать
Else
	'тут проблемы какие-то с ответом
End if
...
Рейтинг: 0 / 0
Обработка xml
    #38148261
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бррр, а какое свойство можно проверить у блока текста в xml
...
Рейтинг: 0 / 0
Обработка xml
    #38148265
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
parserError
...
Рейтинг: 0 / 0
Обработка xml
    #38148269
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
parseError
очепятка выше
...
Рейтинг: 0 / 0
Обработка xml
    #38148272
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно не понимаю ваши односложные ответы :)
Отстаю. Спасибо.
...
Рейтинг: 0 / 0
Обработка xml
    #38148288
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0,5к деревянных банковским переводом за готовый кусок кода :(
...
Рейтинг: 0 / 0
Обработка xml
    #38148291
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
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
Обработка xml
    #38148310
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот-вот, как раз хотел написать, что
Код: vbnet
1.
2.
    Set doc = http.responseXML
    Debug.Print doc.parseError.ErrorCode


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

Код: 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
Обработка xml
    #38148400
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут разжёвано на примере получения курсов с сайта ЦБ применительно к акцесу
http://www.cyberforum.ru/ms-access/thread444017.html
...
Рейтинг: 0 / 0
Обработка xml
    #38148427
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One, дружище, огромное спасибо за инициативу! Честно, благодарен. Но, черт побери, уже сломал все, что работало. Сейчас мысли в кучу соберу...
...
Рейтинг: 0 / 0
Обработка xml
    #38148454
Frost_Imp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще не знаю что делать.
Итак, переменная замечательно передается из функции в функцию.
Ошибка 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
25 сообщений из 30, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Обработка xml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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