设置对Microsoft XML V6.0的引用后,以下代码按预期工作,为“buy_max”恢复所需的值
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.Load ("http://api.eve-central.com/api/marketstat?typeid=24692&usesystem=30000142")
buy_max = xmlDoc.getElementsByTagName("buy")(0).getElementsByTagName("max")(0).Text
另一方面,以下代码无法返回“buy_max”的值。而是产生错误(运行时错误91“对象变量或未设置块变量”)。
my_url = "http://api.eve-central.com/api/marketstat?typeid=24692&usesystem=30000142"
Set html_doc = CreateObject("htmlfile")
Set xml_obj = CreateObject("MSXML2.XMLHTTP")
xml_obj.Open "GET", my_url, False
xml_obj.send
html_doc.body.innerhtml = xml_obj.ResponseText
buy_max = html_doc.getElementsByTagName("buy")(0).getElementsByTagName("max")(0).innertext
任何人都可以解释为什么第二种方法失败了吗? TIA,ron
答案 0 :(得分:2)
我无法解释,但我可以给你一些信息。我运行你的代码,转到立即窗口并输入
?left(html_doc.body.innerHTML,50)
62</VOLUME><AVG>187369914.11</AVG><MAX>191103298.9
奇怪的是它将在第一个VOLUME的结束标记之后开始。所以我查看了ResponseText
?left(xml_obj.responseText,50)
<?xml version='1.0' encoding='utf-8'?>
<evec_api v
从正确的地方开始。作为MSHTML一部分的HTML解析器正在做出意想不到的事情。但我肯定无法弄清楚它为什么这样做。我认为引号有些问题 - 就像它们不是真正的引用一样。所以我复制了xml并将其粘贴到Notepad中,以便显示非标准字符或转换它们。我保存了文本文件,将其读入html文档并完全相同的错误。
然后我开始将越来越少的xml文件复制到记事本中 - 相同。我开始只是复制了
<volume>62</volume>
和html_doc.body.innertext返回
62</volume>
所以我复制了
<avg>187369914.11</avg>
和html_doc.body.innertext返回
187369914.11</avg>
最后,我把它放在文件中
<p><volume>62</volume></p>
hmtl_doc.body.innerhtml返回
<P>
<P>62</VOLUME></P>
<P></P>
然后我放弃了。对不起,这不是一个答案,但希望其他人可以插话。
答案 1 :(得分:1)
为什么会失败:
第一个.getelementsbytagname("buy")(0)
调用返回一个空对象。第二个.getelementsbytagname
调用是在一个null对象上,将导致错误91。
奇怪的是,ResponseText
被隐含地分为innerhtml
和outerhtml
(即使您使用.innerhtml = ...
。
我建议选择innerhtml
内的标记;假设我们选择“min”。如果您尝试Set buy_max = html_doc.getElementsByTagName("min")(0)
然后检查此对象,您会看到新对象innerhtml
内容已恢复到原来的位置(html_doc
内);但即便如此,任何其他.getelementsbytagname
调用都将返回一个空对象。
帮助调试:
单击Views --> Locals Window
以帮助可视化对象的内容以及可用的变量。您需要在初始化对象并设置值后设置断点。
请问:
为什么第一种解决方案(已经有效)不够好?
我将添加:
如果您只是寻找第一个解决方案的替代方案,请查看此处:HtmlDocument Class Resource (MSDN)
答案 2 :(得分:1)
"HTMLFile"
实例似乎只能在Open
方法完成某种初始化后使用。
<强>的VBScript:强>
Set html_doc = CreateObject("htmlfile")
html_doc.Open
' whatever you have to do
html_doc.Close
<强> JavaScript的:强>
var html_doc = new ActiveXObject("htmlfile");
html_doc.open();
// whatever you have to do
html_doc.close();
Open
方法根据我的经验,如果你不调用Open
方法,那么就不可能使用对象的某些方法和属性,而其他属性和方法表现正常。这很令人困惑,因为没有消息,错误或任何说明该做什么的事情。
write
方法无效或抛出body
文档的属性为null innerHTML
属性在读取时为null,在写入时抛出createElement
文档方法正常工作tagName
任何元素的属性都可以使用