现在学校已经到了夏天,我有一些空闲时间,我选择创建个人图书库存系统。在研究时,我发现了朱尔斯的这篇文章:ISBN -> bookdata Lookup to fill in a database
尝试在下面实施我的代码时,我在使用Run-time error: Access is denied
时首先得到Set xmlhttp = CreateObject("MSXML2.xmlhttp")
。我发现了一条帖子(http://social.msdn.microsoft.com/Forums/en-US/1abda1ce-e23c-4d0e-bccd-a323aa7f2ea5/access-is-denied-while-using-microsoftxmlhttp-to-get-a-url-link-in-vbscript-help),表示要将该行更改为Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
。
我现在正在接收Run-time error '91': Object variable or With block variable not set.
任何人对如何解决此问题都有任何想法?我是使用XML的新手。为了测试,我使用立即窗口并输入testlookup("0007102968")
。
模块SearchISBN:
Option Compare Database
Option Explicit
Public Function testlookup(value As String)
Dim book
Set book = New isbn
book.Lookup (value)
Debug.Print book.Title
Debug.Print book.PublisherText
End Function
Class Module isbn:
Option Compare Database
Option Explicit
'https://stackoverflow.com/questions/2454348/isbn-bookdata-lookup-to-fill-in-a-database
' AccessKeys created with account on ISBNDB.com
' Reference in (Tools->Refernces) made to "Microsoft XML"
Dim strTitle As String
Dim strAuthor As String
Dim strPublisher As String
Dim strSummary As String
Dim strPrice As Currency
Dim strISBN10 As Integer
Dim strISBN13 As Integer
Dim strNotes As String
'Dim strPersRating As String
Dim accessKey As String
Private Sub Class_Initialize()
' Set AccessKey value of ISBNDB API
accessKey = "NSOY388Z"
End Sub
Property Get Title() As String
Title = strTitle
End Property
Property Get Author() As String
Author = strAuthor
End Property
Property Get Publisher() As String
Publisher = strPublisher
End Property
Property Get Summary() As String
Summary = strSummary
End Property
Property Get Price() As Currency
Price = strPrice
End Property
Property Get ISBN10() As Integer
ISBN10 = strISBN10
End Property
Property Get ISBN13() As Integer
ISBN13 = strISBN13
End Property
Property Get Notes() As String
Notes = strNotes
End Property
Public Function Lookup(isbn As String) As Boolean
Lookup = False
' Dim xmlhttp
' Dim strTest As String
' strTest = "https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn
' Debug.Print strTest
' 'Run-time error, access is denied
' ' Set xmlhttp = CreateObject("MSXML2.xmlhttp")
' Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
' xmlhttp.Open "Get", strTest, False '"https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn, False
' xmlhttp.send
' Debug.Print xmlhttp.responseText
' Debug.Print "Response: " & xmlhttp.responseXML.XML '
' Dim xmldoc
'' Set xmldoc = CreateObject("Microsoft.XMLDOM")
'' xmldoc.loadXML (xmlhttp.responseXML.XML)
'' ERROR
'' If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") = 0) Then
'' MsgBox "Invalid ISBN or not in database"
'' Exit Function
'' End If
'' If (xmldoc.selectSingleNode("//BookList").getAttribute("total_results") > 1) Then
'' MsgBox "Caution, got more than one result!"
'' Exit Function
'' End If
'
' Set xmldoc = New DOMDocument
' xmldoc.loadXML (xmlhttp.responseText)
'
'
'
' strTitle = xmldoc.selectSingleNode("//BookData/TitleLong").Text
' strAuthor = xmldoc.selectSingleNode("//BookData/AuthorsText").Text
' strPublisher = xmldoc.selectSingleNode("//BookData/PublisherText").Text
' strNotes = xmldoc.selectSingleNode("//BookData/Notes").Text
' strSummary = xmldoc.selectSingleNode("//BookData/Summary").Text
'
Dim xmlhttp As MSXML2.xmlhttp
Dim xmldoc As MSXML2.DOMDocument
Dim XMLNodes As MSXML2.IXMLDOMNodeList
Dim xmlElement As MSXML2.IXMLDOMElement
Dim bookTitle As String
Dim myErr As MSXML2.IXMLDOMParseError
Dim strTest As String
strTest = "https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn
' Fetch the XML - THIS IS WHERE I AM NOW GETTING ERROR
xmlhttp.Open "Get", strTest, False '"https://isbndb.com/api/books.xml?access_key=" & accessKey & "&results=texts&index1=isbn&value1=" & isbn, False
xmlhttp.send
Set xmldoc = New DOMDocument
xmldoc.loadXML (xmlhttp.responseText)
Set XMLNodes = xmldoc.getElementsByTagName("BookData")
Dim i As Integer
' Get the data
For i = 1 To XMLNodes.length
Set xmlElement = XMLNodes.nextNode
bookTitle = xmlElement.getElementsByTagName("Title").Item(0).nodeTypedValue
Next
Lookup = True
End Function
编辑:仍然收到错误,但我现在在即时窗口中收到回复:
https://isbndb.com/api/books.xml?access_key=NSOY388Z&results=texts&index1=isbn&value1=0007102968
Response:
<?xml version="1.0" encoding="UTF-8"?>
<ISBNdb server_time="2013-06-20T16:20:00Z">
<BookList total_results="1" page_size="10" page_number="1" shown_results="1">
<BookData book_id="the_times_book_of_quotations" isbn="0007102968" isbn13="9780007102969">
<Title>The Times book of quotations</Title>
<TitleLong></TitleLong>
<AuthorsText></AuthorsText>
<PublisherText publisher_id="times_books">[Glasgow] : Times Books : 2000.</PublisherText>
<Summary></Summary>
<Notes>Includes index.</Notes>
<UrlsText></UrlsText>
<AwardsText></AwardsText>
</BookData>
</BookList>
</ISBNdb>
https请求的浏览器结果:
答案 0 :(得分:1)
由于VBA中的XML有时对我来说很难,我只需要获取XML响应文本,然后将其加载到MSXML2.DOMDocument
中。从那里,您可以解析并获取所需的数据。首先,您需要确保该文件具有对Microsoft XML dll的引用(通过从Visual Basic窗口中选择工具&gt;引用然后选择“Microsoft XML 6.0”来执行此操作)。
至于代码,它看起来像这样:
Dim xmlhttp As MSXML2.xmlhttp
Dim xmldoc As MSXML2.DOMDocument
Dim XMLNodes As MSXML2.IXMLDOMNodeList
Dim xmlElement As MSXML2.IXMLDOMElement
Dim bookTitle as String
' Fetch the XML
Set xmlhttp = CreateObject("Microsoft.xmlHTTP")
xmlhttp.Open "Get", yourURL, False
xmlhttp.send
' Create a new XMLDocument to which to load the XML text
Set xmlDoc = New DOMDocument
xmldoc.LoadXML (xmlhttp.responseText)
' Get all of the BookData Nodes and fetch the first node
Set XMLNodes = xmldoc.getElementsByTagName("BookData")
' Get your data (retrieved only the Title as an example)
for i = 1 to XMLNodes.length
Set myElement = XMLNodes.NextNode
bookTitle = myElement.getElementsByTagName("Title").Item(0).nodeTypedValue
Next
你可以摆脱for循环,如果你确定你只会得到一个回应(鉴于它的isbn我想你应该......)