Excel 为什么使用MSXMLv3.0解析XML文档有效,而MSXMLv6.0却不能';T
因此,我正在从事一个项目,根据每个来源的特点,使用多种不同的方法从互联网上的许多不同来源收集数据 最近添加的是一个webExcel 为什么使用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-
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没有问题。它有一个默认的名称空间(即没有前缀),格式非常好。但是,在给定节点级别只能有一个默认名称空间。在子级添加默认值需要多个