假设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文件的提供商提供的。这段代码启发了我的代码,但在翻译中丢失了一些东西。)
非常感谢你能提供的任何帮助。
1条答案
按热度按时间yqlxgs2m1#
XML有一个应用于其内容的"默认"名称空间,因此在使用xpath时,需要为该名称空间创建一个伪别名,并在查询中使用它。
参见https://stackoverflow.com/a/72997440/478884
例如: