Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 为什么使用MSXMLv3.0解析XML文档有效,而MSXMLv6.0却不能';T_Excel_Vba_Web Scraping_Msxml6_Msxml3 - Fatal编程技术网

Excel 为什么使用MSXMLv3.0解析XML文档有效,而MSXMLv6.0却不能';T

Excel 为什么使用MSXMLv3.0解析XML文档有效,而MSXMLv6.0却不能';T,excel,vba,web-scraping,msxml6,msxml3,Excel,Vba,Web Scraping,Msxml6,Msxml3,因此,我正在从事一个项目,根据每个来源的特点,使用多种不同的方法从互联网上的许多不同来源收集数据 最近添加的是一个webAPI调用,它返回以下XML作为响应: 29b526a69b9445a7bb507ba446e3e8f9 1. A44 10X1001A1001A450 A32 10X1001A1001A450 A33 2019-09-19T11:28:51Z 2019-09-18T22:00Z 2019-09-19T22:00Z 1. A62 10YCS-SERBIATSOV 10YCS-

因此,我正在从事一个项目,根据每个来源的特点,使用多种不同的方法从互联网上的许多不同来源收集数据

最近添加的是一个web
API
调用,它返回以下
XML
作为响应:


29b526a69b9445a7bb507ba446e3e8f9
1.
A44
10X1001A1001A450
A32
10X1001A1001A450
A33
2019-09-19T11:28:51Z
2019-09-18T22:00Z
2019-09-19T22:00Z
1.
A62
10YCS-SERBIATSOV
10YCS-SERBIATSOV
欧元
兆瓦
A01
2019-09-18T22:00Z
2019-09-19T22:00Z
PT60M
1.
44.08
2.
37.14
3.
32.21
4.
31.44
5.
32.48
6.
45.52
7.
56.05
8.
74.96
9
74.08
10
69.03
11
72.89
12
68.91
13
74.95
14
72.91
15
75.97
16
76.49
17
59.08
18
60.19
19
64.69
20
69.18
21
64.97
22
63.38
23
52.92
24
48.08
在使用Microsoft XML v6.0成功地处理了类似的情况后,我尝试了以下方法:

Dim respXML As New MSXML2.DOMDocument60
respXML.LoadXML (ThisWorkbook.Worksheets("Sheet2").Range("A1")) 'for the sake of the post's simplicity I'm loading the xml from excel
Debug.Print respXML.getElementsByTagName("price.amount").Length
Debug.Print respXML.getElementsByTagName("price.amount")(1) Is Nothing
它应该返回
24
,但它返回
0
。 事实上:

Dim respXML As New MSXML2.DOMDocument60
respXML.LoadXML (ThisWorkbook.Worksheets("Sheet2").Range("A1")) 'for the sake of the post's simplicity I'm loading the xml from excel
Debug.Print respXML.getElementsByTagName("price.amount").Length
Debug.Print respXML.getElementsByTagName("price.amount")(1) Is Nothing
返回
True
,这意味着找不到
元素。但是,
Debug.Print respXML.XML
会产生预期的结果

我在某个地方读到,早期绑定可能会导致问题,因此我也尝试了以下方法:

Dim respXML As Object
Set respXML = CreateObject("MSXML2.DOMDocument.6.0")
respXML.LoadXML (ThisWorkbook.Worksheets("Sheet2").Range("A1"))
Debug.Print respXML.getElementsByTagName("price.amount").Length
Debug.Print respXML.getElementsByTagName("price.amount")(1) Is Nothing
结果仍然是一样的

切换到
MicrosoftXML,v3.0
完全解决了这个问题

然而,我更愿意坚持使用v6.0,因为它是一个更积极维护和支持的版本

为什么会发生这种情况?它是否与XML本身有关?这和我的代码有关吗?我错过什么了吗?有没有办法让它与Microsoft XML v6.0兼容


欢迎任何输入。

此处的快速测试表明,使用
DOMDocument60
不会拾取任何节点/元素

我成功地使用了
DOMDocument30
,仍然使用MSXML6解析器。因此,这可能是您的一个解决方法:

'Using the MSXML6 parser, it's still possible to use what worked in older versions
Dim respXML As Msxml2.DOMDocument30
Set respXML = CreateObject("MSXML2.DOMDocument.3.0")
互联网上的研究发现了两个有用的链接,一个在VB论坛上

第一个基本上是说在MSXML6中添加了安全属性,这意味着在MSXML2中工作的一些东西在新版本中将不再适用。这些都在Microsoft的网站上

我不知道它是哪一个(如果有,但最接近的似乎是属性),但另一个变化似乎是解析器如何处理“匿名”名称空间(VB论坛链接)。如果名称空间是在顶级元素中声明的,没有前缀,那么它不会应用于任何子元素——因此它们不会被“看到”

由于问题中的XML代码包含一个没有前缀的名称空间,这似乎就是问题所在。如果声明
DOMDocument30
对您不起作用,而SelectionNamespace也没有帮助,那么我认为唯一的办法就是更改/转换XML,为名称空间和所有元素添加前缀。

要扩展@Cindymister的,问题似乎是使用
getElementsByTagName()
处理MSXML版本之间的命名空间。具体来说,您的XML维护一个
xmlns
属性,该属性没有冒号标识的前缀,解析内容时需要DOM库指定前缀:


阅读这些结构清晰、有用的答案纯粹是一种乐趣+1)。顺便说一句,我个人更喜欢MSXML2 vers 6.0,因为vers 3.0不会在许多较新的系统上自动得到支持。好吧,显然这是有很好的文档记录的,只是我不知道。您能简单地向我解释一下
SelectionNamespaces
属性真正实现了什么设置吗?我知道在最初的XML中,
xmlns
属性中应该包含一个前缀。那么您基本上添加了一个用户定义的文档(doc)?如果有多个没有前缀的名称空间该怎么办?默认名称空间是一种一般的XML情况,远远超出了MSXML,但包括所有其他兼容的用于Java、.NET、PHP、Python等的DOM库。如果解析这个确切的XML,您必须运行相同的过程。您的XML没有问题。它有一个默认的名称空间(即没有前缀),格式非常好。但是,在给定节点级别只能有一个默认名称空间。在子级添加默认值需要多个