DOMDocument方法工作,XMLHTTP方法失败 - 为什么?

时间:2014-01-13 20:21:29

标签: xml vba excel-vba getelementsbytagname excel

设置对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

3 个答案:

答案 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被隐含地分为innerhtmlouterhtml(即使您使用.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任何元素的属性都可以使用