Excel VBA解析XML文件以查找ISBN标题时出现问题:运行时错误91未设置对象变量或With块变量

s1ag04yj  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(156)

假设Excel中的A列有多个包含ISBN(图书ID)值的单元格,我希望VBA宏循环遍历每个单元格,并为每个单元格解析该ISBN唯一的在线XML文件,然后将相应的图书标题放入B列。
例如,如果A1包含1931498717,我应该解析this XML并获取标题“不要想大象!了解自己的价值观并确定辩论的框架:进步人士的基本指南”放在B1。
下面是XML文件的示例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<classify xmlns="http://classify.oclc.org">
  <response code="4"/>
  <!--Classify is a product of OCLC Online Computer Library Center: http://classify.oclc.org-->
  <workCount>2</workCount>
  <start>0</start>
  <maxRecs>25</maxRecs>
  <orderBy>thold desc</orderBy>
  <input type="isbn">1931498717</input>
  <works>
    <work author="Lakoff, George" editions="28" format="Book" holdings="1088" hyr="2014" itemtype="itemtype-book" lyr="2004" owi="796415685" schemes="DDC LCC" title="Don't think of an elephant! : know your values and frame the debate : the essential guide for progressives" wi="796415685"/>
    <work author="Lakoff, George" editions="1" format="Musical score" holdings="1" hyr="2004" itemtype="itemtype-msscr" lyr="2004" owi="4735145535" schemes="DDC" title="Don't think of an elephant! : know your values and frame the debate : the essential guide for progressives" wi="4735145535"/>
  </works>
</classify>

注意,这里有两个“work”元素,在本例中,我很乐意从第一个元素中获取title属性,但更好的方法是确保它是一本书的标题(format=“Book”),而不是其他格式。
下面是我的宏代码:

Sub ISBN()
 Do
   Dim xmlDoc As DOMDocument60
   Set xmlDoc = New DOMDocument60
   xmlDoc.async = False
   xmlDoc.validateOnParse = False

   r = CStr(ActiveCell.Value)
   xmlDoc.Load ("http://classify.oclc.org/classify2/Classify?isbn=" + r + "&summary=true")
  
   ActiveCell.Offset(0, 2).Value = xmlDoc.SelectSingleNode("/classify/works/work[1]").attributes.getNamedItem("title").text
   ActiveCell.Offset(1, 0).Select
 Loop Until IsEmpty(ActiveCell.Value)
End Sub

在引用“xmlDoc.SelectSingleNode(“/classify/works/work[1]”).attributes.getNamedItem(“title”).text”的行上,我得到了这个错误,“运行时错误91对象变量或With块变量未设置”
我已经尝试了无数的变化,试图孤立的标题文本,但不能得到任何其他比这个错误。
我的Excel文件是Microsoft Excel for Microsoft 365,在我的笔记本电脑上。
如果能提供帮助,我将不胜感激。我在VBA编程和XML解析方面缺乏经验,而且我在谷歌上搜索/阅读这方面的内容的时间比我愿意承认的要长,但没有取得任何进展。(有一个关于解析ISBN XML文件的previous StackOverflow question,但它是为一个不再免费提供XML文件的提供商提供的。这段代码启发了我的代码,但在翻译中丢失了一些东西。)
非常感谢你能提供的任何帮助。

yqlxgs2m

yqlxgs2m1#

XML有一个应用于其内容的"默认"名称空间,因此在使用xpath时,需要为该名称空间创建一个伪别名,并在查询中使用它。
参见https://stackoverflow.com/a/72997440/478884
例如:

Dim xmlDoc As DOMDocument60, col As Object, el As Object
Set xmlDoc = New DOMDocument60
xmlDoc.async = False
xmlDoc.validateOnParse = False

'set default namespace and alias "xx"
xmlDoc.SetProperty "SelectionNamespaces", _
                   "xmlns:xx='http://classify.oclc.org'"

xmlDoc.Load "http://classify.oclc.org/classify2/Classify?isbn=1931498717&summary=false"
 
Set col = xmlDoc.SelectNodes("/xx:classify/xx:works/xx:work")
'check each `work` for format and title
For Each el In col
    Debug.Print "*****************"
    Debug.Print el.Attributes.getNamedItem("format").Text
    Debug.Print el.Attributes.getNamedItem("title").Text
Next el

相关问题