Что нового

Определить XML в IE

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если страница в IE отображает XML, например, вот это http://autoit-script.ru/index.php?type=rss;action=.xml;board=1;limit=20

То как это можно определить? Как определить что содержимое это XML?
 

XpycT

Скриптер
Сообщения
380
Репутация
133
inververs
Код:
<?xml version="1.0" encoding="UTF-8"?>
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
у такой страницы нет свойства document, и поэтому как получить этот текст я не представляю, ведь _IEBodyReadHTML или _IEBodyReadText или _IEDocReadHTML не работают в данном случае.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs [?]
у такой страницы нет свойства document, и поэтому как получить этот текст я не представляю
А если как-то так?
Код:
$sRead = InetRead('http://autoit-script.ru/index.php?type=rss;action=.xml;board=1;limit=20', 17)
If @error Then Exit 13
$sRead = BinaryToString($sRead, 4)
$aTmp = StringSplit(StringStripCR($sRead), @LF, 2)
ConsoleWrite($aTmp[0] & @LF)

$sRead = ''
$aTmp = 0
$sRead = InetRead('http://autoit-script.ru/index.php', 17)
If @error Then Exit 13
$sRead = BinaryToString($sRead, 4)
$aTmp = StringSplit(StringStripCR($sRead), @LF, 2)
ConsoleWrite($aTmp[0] & @LF)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
:( а без повторного скачивания всего ресурса никак?
 

XpycT

Скриптер
Сообщения
380
Репутация
133
inververs
Вариант 1
Код:
$oXML = ObjCreate("Msxml2.DOMDocument.6.0")

$sRead = InetRead('http://autoit-script.ru/index.php?type=rss;action=.xml;board=1;limit=20', 17)
If @error Then Exit 13
$oXML.LoadXML(BinaryToString($sRead, 4))
If $oXML.ParseError.ErrorCode <> 0 Then ConsoleWrite("XML Load Error > " & $oXML.ParseError.Reason & @CR)

$sRead = InetRead('http://autoit-script.ru/index.php', 17)
If @error Then Exit 13
$oXML.LoadXML(BinaryToString($sRead, 4))
If $oXML.ParseError.ErrorCode <> 0 Then ConsoleWrite("XML Load Error > " & $oXML.ParseError.Reason & @CR)


Вариант 2
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")

$oHTTP.Open("HEAD", "http://autoit-script.ru/index.php?type=rss;action=.xml;board=1;limit=20")
$oHTTP.SetRequestHeader("User-Agent", "AuotIt_Script")
$oHTTP.Send("")
$oHTTP.WaitForResponse
ConsoleWrite("HTTP Content-Type:" & $oHTTP.GetResponseHeader("Content-Type") & @CR)

$oHTTP.Open("GET", "http://autoit-script.ru/index.php")
$oHTTP.SetRequestHeader("User-Agent", "AuotIt_Script")
$oHTTP.Send("")
$oHTTP.WaitForResponse
ConsoleWrite("HTTP Content-Type:" & $oHTTP.GetResponseHeader("Content-Type") & @CR)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
XpycT
о первый вариант с LoadXML интересный!! но возвращает ошибку
XML Load Error > DTD запрещен
если бы был способ "приатачить" уже существующий объект IE в какой нибудь Msxml2.DOMDocument.6.0 и затем вызывать свойство, типа isXML, то это был бы идеальный вариант.
Но пока выберу чтение заголовка Content-Type.
 

XpycT

Скриптер
Сообщения
380
Репутация
133
inververs [?]
но возвращает ошибку XML Load Error > DTD запрещен
Это ошибка выпадает только когда в LoadXML передается не XML



Добавлено:
Сообщение автоматически объединено:

А можешь показать как ты получаешь код страницы?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
XpycT [?]
А можешь показать как ты получаешь код страницы?
суть сводится к тому, что нажимается ссылка, открывается новая вкладка, соответсвенно получаю новый объект IWebBrowser2. Для простоты, тоже самое можно получить проделав _IEAttach. Дальше мне нужно узнать, что содержится. Если это XML то одно действие, если это обычный HTML документ, то другое.



Добавлено:
Сообщение автоматически объединено:

как я пониманию .LoadXML скачивает ресурс повторно?


Добавлено:
Сообщение автоматически объединено:

HEAD и разбор Content-Type не подошел.
Т.к не все серверы его правильно устанавливают. Вот, например, http://atb-andre.ucoz.ru/news/rss/
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
???
Код:
HTTP Content-Type:text/html; charset=UTF-8
вот этот
Код:
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
$oHTTP.Open("HEAD", "http://atb-andre.ucoz.ru/news/rss/")
$oHTTP.SetRequestHeader("User-Agent", "AuotIt_Script")
$oHTTP.Send("")
$oHTTP.WaitForResponse
ConsoleWrite("HTTP Content-Type:" & $oHTTP.GetResponseHeader("Content-Type") & @CR)
 

XpycT

Скриптер
Сообщения
380
Репутация
133
inververs
Да вы правы, запрос HEAD возвращает
Код:
HTTP Content-Type:text/html; charset=UTF-8

А если оправить GET запрос то возвращает
Код:
HTTP Content-Type:text/xml; charset=UTF-8
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
У меня так работает (без проверок на ошибки).
Код:
#include <Array.au3>

Local $aData[6][6] = [[5, 'Page', 'IP', 'First tag', 'XML?', 'Time'],['autoit-script.ru', '/index.php?type=rss;action=.xml;board=1;limit=20'],['autoit-script.ru', '/index.php'], _
		['atb-andre.ucoz.ru', '/news/rss/'],['mail.ru', '/'],['news.yandex.ru', '/hardware.rss']], $iSocket

TCPStartup()

For $i = 1 To $aData[0][0]
	If Not $aData[$i][2] Then $aData[$i][2] = TCPNameToIP($aData[$i][0])
	$iSocket = TCPConnect($aData[$i][2], 80)
	TCPSend($iSocket, 'GET ' & $aData[$i][1] & ' HTTP/1.0' & @CRLF & 'Host: ' & $aData[$i][0] & @CRLF & 'Connection: Close' & @CRLF & @CRLF)
	$aData[$i][5] = TimerInit()
	While TimerDiff($aData[$i][5]) < 5000
		$aData[$i][3] &= TCPRecv($iSocket, 64)
		If @error Then ExitLoop
		If $aData[$i][3] Then
			If StringRegExp($aData[$i][3], '<.+?>') Then ExitLoop
		EndIf
	WEnd
	TCPCloseSocket($iSocket)
	$aData[$i][3] = StringRegExpReplace($aData[$i][3], '(?s).+?[\r\n]{4}(<.+?>).*', '$1')
	If @extended <> 1 Then $aData[$i][3] = 'Error'
	$aData[$i][4] = (StringInStr($aData[$i][3], 'xml') <> 0)
	$aData[$i][5] = StringFormat('%.2f msec', TimerDiff($aData[$i][5]))
Next

TCPShutdown()
$aData[0][0] = 'Host'
_ArrayDisplay($aData)
 
Верх