Что нового

Чтение XML с веб-страницы.

scanfail

Знающий
Сообщения
244
Репутация
17
Друг попросил помочь ему, но мне с XML работать в au ни разу не приходилось.

Есть сайт, она представляет XML версию ежедневнего курса.

Вот XML на 02.08.2012:
http://www.cbar.az/currencies/02.08.2012.xml

А вот GUI под него:
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Курс v0.1", 257, 186, 192, 124)
$Group1 = GUICtrlCreateGroup("", 8, 0, 240, 44)
$Label1 = GUICtrlCreateLabel("Выберите", 16, 16, 54, 17)
$Combo1 = GUICtrlCreateCombo("Месяц", 72, 14, 73, 25)
GUICtrlSetData(-1, "Январь|Февраль|Март|Апрель|Май|Июнь|Июль|Август|Сентябрь|Октябрь|Ноябрь|Декабрь")
$Label2 = GUICtrlCreateLabel("и", 152, 16, 10, 17)
$Combo2 = GUICtrlCreateCombo("День", 168, 14, 73, 25)
GUICtrlSetData(-1, "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")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Узнать курс", 88, 48, 75, 25, $WS_GROUP)
$List1 = GUICtrlCreateList("", 8, 80, 241, 97)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Может у кого есть простенькие примеры?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
насколько мне известно, более менее сносного xml-парсера для autoit нет. я решал абсолютно такую же задачу только с цбрф, там тоже xml, правда я использовал python и beautiful soup. а для autoit единственное, что мне приходит в голову, это парсить xml регулярными выражениями.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
scanfail
Можно установить MSXML 6.
Тут подробнее http://www.microsoft.com/en-us/download/details.aspx?id=3988
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Код:
#include <WindowsConstants.au3>
$Form1 = GUICreate("Курс v0.1", 257, 186, 192, 124)
$date = GUICtrlCreateDate(@YEAR & "/" & @MON & "/" & @MDAY, 82, 16, 90, 25, 0x01)
;~ $Group1 = GUICtrlCreateGroup("", 8, 0, 240, 44)
;~ $Label1 = GUICtrlCreateLabel("Выберите", 16, 16, 54, 17)
;~ $Combo1 = GUICtrlCreateCombo("Месяц", 72, 14, 73, 25)
;~ GUICtrlSetData(-1, "Январь|Февраль|Март|Апрель|Май|Июнь|Июль|Август|Сентябрь|Октябрь|Ноябрь|Декабрь")
;~ $Label2 = GUICtrlCreateLabel("и", 152, 16, 10, 17)
;~ $Combo2 = GUICtrlCreateCombo("День", 168, 14, 73, 25)
;~ GUICtrlSetData(-1, "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")
;~ GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Узнать курс", 88, 48, 75, 25, $WS_GROUP)
$List1 = GUICtrlCreateList("", 8, 80, 241, 97)
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
		Case $Button1
			GUICtrlSetData($List1,xml(GUICtrlRead($date)))
    EndSwitch
WEnd
Func xml($d)
$inet=BinaryToString(InetRead('http://www.cbar.az/currencies/'&$d&'.xml',1),4)
$str=StringRegExp($inet,'(?s)<Name>(?-s)(.*?)</Name>(?s).*?<Value>(?-s)(.*?)</Value>',3)
$res=''
For $i=0 To UBound($str)-1 Step 2
	$res&=$str[$i]&'   ===  '&$str[$i+1]&'|'
Next
Return $res
EndFunc
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Спасибо огромное, осталось только доделать очистку листа после изменения даты и еще вывод сообщения об ошибке, при неправильной дате(пример: 01.01.2099).
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Замени @YDAY на @MDAY, я ошибся.
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
А собственно вопрос назрел, как при каждом нажатие на $Button1 обновлять $List1?
 

sngr

AutoIT Гуру
Сообщения
1,015
Репутация
411
Код:
GUICtrlSetData($List1,'')
GUICtrlSetData($List1,xml(GUICtrlRead($date)))
 

XpycT

Скриптер
Сообщения
380
Репутация
133
scanfail
Мой вариант
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1_1 = GUICreate("???? v0.1", 257, 188, 521, 159)
$Group1 = GUICtrlCreateGroup("", 8, 0, 240, 44)
$Label1 = GUICtrlCreateLabel("Выберите", 16, 16, 54, 17)
$Date1 = GUICtrlCreateDate("2012/08/02 12:16:14", 75, 15, 166, 21)
GUICtrlSendMsg($Date1, 0x1032, 0, "dd.MM.yyyy")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Узнать курс", 88, 48, 75, 25)
$List1 = GUICtrlCreateList("", 8, 80, 241, 97)
GUICtrlSetData(-1, "")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Button1
			GUICtrlSetData($List1, "")
			GUICtrlSetData($List1, _Check())

		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Check()
	Local $sRet = "", $sDate = GUICtrlRead($Date1)

	$sXML = BinaryToString(InetRead("http://www.cbar.az/currencies/" & $sDate & ".xml", 1), 4)

	$oXML = ObjCreate("Msxml2.DOMDocument.3.0")
	$oXML.LoadXML($sXML)

	$oValutes = $oXML.SelectNodes("ValCurs/ValType/Valute")
	For $oValute In $oValutes
		$sName = $oValute.SelectSingleNode("Name").Text
		$sValue = $oValute.SelectSingleNode("Value").Text

		$sRet &= $sName & " = " & $sValue & "|"
	Next

	Return $sRet
EndFunc
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
А как вывести MsgBox с ошибкой, если дата выбрана неправильно? Например, сегодня 02, а выбрана 03.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
scanfail

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Администратор.
 
Верх