Почему не работает код?

Если название форума вам о чём-то говорит, то значит, внутри вы найдете что-то для себя полезное.
VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Почему не работает код?

Сообщение VBTerminator » 06.04.2009 (Пн) 16:44

Почему не работает следующий код?
Код: Выделить всё
    xmlDoc.async = False
    xmlDoc.validateOnParse = False
   
    xmlDoc.Load (App.Path & "\weather_input.xml")
    xmlDoc.setProperty "SelectionLanguage", "XPath"
   
    MsgBox xmlDoc.selectSingleNode("//tbody[@class='near']").selectSingleNode("tr[@class='t2']"). _     selectSingleNode("th[@class='date']").selectSingleNode("th[@class='date']").selectSingleNode("b").Text


Проблемы возникли на последней строке. Пишет, что "Object variable or With block variable not set".

Интересующий меня отрывок из XML-документа:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
...
<tbody class="near">
            <tr class="t2 ">
                <th rowspan="4"><i>пн</i></th>
            </tr>
</tbody>
Последний раз редактировалось VBTerminator 06.04.2009 (Пн) 16:55, всего редактировалось 1 раз.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 06.04.2009 (Пн) 16:50

Код потому что кривой :) Если б ты начал писать нормальный запрос, не состоящий из кучи вложенных вызовов, а сделал как я написал, то заметил бы что:
1. У тебя лишний элемент пути th[@class='date']
2. В документе нет tr[@class='t2'], а есть tr[@class='t2 ']

Код: Выделить всё
MsgBox xmlDoc.selectSingleNode("//tbody[@class='near']/tr[@class='t2']/th[@class='date']/b").text


С учетом как я погляжу, последних изменений в посте:

Код: Выделить всё
MsgBox xmlDoc.selectSingleNode("//tbody[@class='near']/tr[@class='t2']/th[@rowspan=4]/i").text


Да, я намеренно убрал последний пробел после t2, потому что это не кошерно, такие атрибуты заводить.
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 06.04.2009 (Пн) 16:57

RayShade писал(а):Да, я намеренно убрал последний пробел после t2, потому что это не кошерно, такие атрибуты заводить.

Это не я, а разработчики служб Яндекса.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 06.04.2009 (Пн) 17:01

Вот дятлы :) Ну тогда, поставь там пробел в коде -- просто он играет большую роль так сказать :) Хотя, могу предложить вариант, которому будет пофиг на пробелы:
Код: Выделить всё
MsgBox xmlDoc.selectSingleNode("//tbody[normalize-space(@class)='near']/tr[normalize-space(@class)='t2']/th[normalize-space(@class)='date']/b").text
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 06.04.2009 (Пн) 17:16

Увы, не помогло. Привожу полные варианты модуля с кодом и XML-файла:
Код: Выделить всё
Option Explicit
Dim xmlDoc As New MSXML2.DOMDocument30
Dim xmlWeatherNode As MSXML2.IXMLDOMElement
Dim xmlCurrenrNode As MSXML2.IXMLDOMElement

Public Sub GetWeatherData()
    Dim strGettingData As String

    strGettingData = frmMain.inetYandexControl.OpenURL("http://weather.yandex.ru/27890/details/")
    If strGettingData = "" Then AddLog "! Ñòðàíèöà äàííûõ ïîãîäû íåäîñòóïíà!": Exit Sub
   
    Open App.Path & "\weather_input.xml" For Output As #10
    Print #10, strGettingData
    Close #10
   
    xmlDoc.async = False
    xmlDoc.validateOnParse = False
   
    xmlDoc.Load (App.Path & "\weather_input.xml")
    xmlDoc.setProperty "SelectionLanguage", "XPath"
   
    MsgBox xmlDoc.selectSingleNode("//tbody[normalize-space(@class)='near']/tr[normalize-space(@class)='t2']/th[normalize-space(@class)='date']/b").Text
End Sub
Вложения
weather_input.rar
Файл "App.Path & "\weather_input.xml""
А так, это http://weather.yandex.ru/27890/details/
(4.45 Кб) Скачиваний: 193

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 06.04.2009 (Пн) 17:36

Гы. Я не знаю, почему так, но короче я добавил ко всем тегам имя неймспейса и у меня все вышло :)
Код: Выделить всё
//default:tbody[normalize-space(@class)='near']/default:tr[normalize-space(@class)='t2']/default:th[normalize-space(@class)='date']/default:b
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 06.04.2009 (Пн) 17:44

RayShade писал(а):имя неймспейса

Имя чего?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 06.04.2009 (Пн) 18:17

Namespace prefix :) default:tbody -- здесь default это namespace, а tbody - имя тега.
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 06.04.2009 (Пн) 18:27

RayShade писал(а):Namespace prefix :) default:tbody -- здесь default это namespace, а tbody - имя тега.

А как это оформлять в xml-файле? Как атрибут "namespace="default"" у тэга, или как?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 06.04.2009 (Пн) 18:33

А в XML это не надо никак оформлять :) Тут просто XML такой, что парсер к нему запросы без указания этого префикса не принимает :) Я хз отчего это.
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 07.04.2009 (Вт) 7:50

Ха! "А в XML это не надо никак оформлять..."
Заменил "ошибочный" запрос на твой, xml-файл даже и не трогал, и получил в лицо:
Microsoft Visual Basic писал(а):Ссылка на необъявленный префикс пространства имён: "default".

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 07.04.2009 (Вт) 9:31

Ха ха. Я вчера вот пользовался java имплементацией парсера/валидатора -- там все окей, в смысле что и документ грузится и выборка идет. А сейчас вот гружу это дело в MSXML2.DOMDocument, так ощибок никаких нет, но и DOM модель вся пустая :)
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 07.04.2009 (Вт) 10:52

Ладно, хотел облегчить себе жизнь...
Придётся вручную парсить документ и выбирать значения.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 07.04.2009 (Вт) 10:53

Проблема в том что парсер неадекватно реагирует на DOCTYPE. Надо найти счас способ это дело обойти.
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 07.04.2009 (Вт) 11:26

Перед записью в файл вставил следующий код:
Код: Выделить всё
Replace strGettingData, Replace("<!DOCTYPE html PUBLIC |-//W3C//DTD XHTML 1.0 Transitional//EN| |http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd|>", "|", Chr(34)), ""

Не помогло.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 07.04.2009 (Вт) 11:37

Чего-то странный replace какой-то. Почему просто не убить эту строку чем-то типа regxp вот такого вида \<!DOCTYPE.+?\>
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 07.04.2009 (Вт) 12:02

Заинтриговало...
Синтаксис опиши, пожалуйста.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Re: Почему не работает код?

Сообщение RayShade » 07.04.2009 (Вт) 12:10

Код: Выделить всё
Function ReplaceTest(patrn, searchStr, replStr)
  Dim regEx as Object
  Set regEx = New RegExp
  regEx.Pattern = patrn
  regEx.IgnoreCase = True
  ReplaceTest = regEx.Replace(searchStr, replStr)
End Function


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

Код: Выделить всё
ReplaceTest "\<!DOCTYPE.+?\>", strGettingData, ""


А, ну и RegExp чтоб создавать надо наверняка там референс какой-то подключить к проекту. А может и нет -- я не помню :)
I don't understand. Sorry.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Почему не работает код?

Сообщение VBTerminator » 07.04.2009 (Вт) 12:53

RayShade писал(а):А, ну и RegExp чтоб создавать надо наверняка там референс какой-то подключить к проекту. А может и нет -- я не помню :)

Надо, надо...


Вернуться в XML/XSL/XHTML

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList