|
楼主 |
发表于 2011-6-1 23:37
|
显示全部楼层
浅谈XMLHTTP对象(属性和方法)-VBA抓取网页数据 (2)
readyState属性
返回XMLHTTP请求的当前状态
此属性只读,返回值为4字节的长整型(具体值请看备注)
当XMLHttp对象把一个HTTP请求发送到服务器时将经历若干种状态:一直等待直到请求被处理;然后,它才接收一个响应。这样以来,脚本才正确响应各种状态-XMLHttpRequest对象拥有一个描述对象的当前状态的readyState属性。
语法
strValue = oXMLHttpRequest.readyState;
示例
Dim XmlHttp As Object
Set XmlHttp = CreateObject("Msxml2.XMLHTTP.3.0")
XmlHttp.Open "GET", "http://localhost/test.xml", True
XmlHttp.send
If XmlHttp.readyState = 4 Then
MsgBox "Done"
End If
备注
此属性只读,状态用长度为4的整型表示(4-byte integer).定义如下:
0
"未初始化"状态。此时,已经创建一个XMLHttpRequest对象,但是还没有初始化(即还没调用open方法)。
1
"初始化"状态。此时,已经调用open方法,并且XMLHttpRequest对象已经准备好把一个请求发送到服务器,但还没调用send方法。
2
"发送"状态。此时,已经调用send方法,把一个请求发送到服务器端,但是还没有收到一个响应,即是当前的状态及http头部信息未知。
3
"正在接收"状态。此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束,这时通过responseBody和responseText获取部分数据会出现错误。
4
数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
Note
从MSXML 3.0开始,如果在数据还没有加载完毕(例如,在加载状态或交互式状态)前就读取status 属性,则会返回一个错误信息:"The data necessary to complete this operation is not yet available."
版本
MSXML 2.0及以上版本
responseBody属性
以未解码的二进制数组形式返回HTTP服务器响应数据。
语法
strValue = oXMLHttpRequest.responseBody;
示例
Dim xmlhttp As New Msxml2.XMLHTTP50
xmlhttp.open "GET", "http://localhost/test.xml", False
xmlhttp.send
MsgBox UBound(xmlhttp.responseBody)
备注
返回值为Variant类型,只读。XMLHTTP的responseBody从服务器返回一个二进制数组,即一个类型为VT_ARRAY | VT_UI1*的安全数组(SAFEARRAY)来表示返回数据的实体。他包含了从服务器返回的未经解码的二进制数据,因此,基于请求不同的服务器,最终 会显示不同的二进制编码数据(UTF-8, UCS-2, UCS-4, Shift_JIS等等)。
*VT_UI1:无符号1字节整数(BYTE)数组
当Variant的数据类型为VT_ARRAY | VT_UI1时,返回一个SAFEARRAY安全数组
如果想返回解码后的数据实体则需要进行编码转换来解码,否则会发生乱码。如以下程序会发生中文乱码:
Dim xmlhttp As New Msxml2.XMLHTTP50
xmlhttp.open "GET", "http://localhost/test.xml", False
xmlhttp.send
MsgBox xmlhttp.responseBody
以下为编码转换函数:
Function bytes2BSTR(arrBytes) '编码转换
Dim strReturn As String
Dim ThisCharCode As String
Dim NextCharCode As String
Dim i As Long
strReturn = ""
arrBytes = CStr(arrBytes)
For i = 1 To LenB(arrBytes)
ThisCharCode = AscB(MidB(arrBytes, i, 1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(arrBytes, i + 1, 1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next i
bytes2BSTR = strReturn
End Function
以下程序不会发生乱码了:
Dim xmlhttp As New Msxml2.XMLHTTP50
xmlhttp.open "GET", "http://localhost/test.xml", False
xmlhttp.send
MsgBox bytes2BSTR(xmlhttp.responseBody)
版本
MSXML 2.0及以上版本
转自:http://metrom.blog.163.com/blog/static/20298163200911301090153/
[ 本帖最后由 Dillon 于 2011-6-2 10:27 编辑 ] |
|