尽可能接近你的OP
我提请您注意几个错误或误解:
那么 .LoadXML ("C:\folder\folder\name.xml") 和 .Load ("C:\folder\folder\name.xml") 之间有什么区别?
Load
期望一个文件路径然后将文件内容加载到oXML对象中。
LoadXML
不需要文件参数,但它是实际的XML 文本内容那必须是一个结构良好的字符串。
-
[2]
XML 区分大小写,因此节点需要通过其确切的文字名称来寻址:
这<Query>
节点不会被识别"query", 《概念模型》不等于“概念模型”.
作为第二个问题我想问一下
Dim oXml As MSXML2.DOMDocument
会是一样的
Dim oXml As MSXML2.DOMDocument60
,
自从我签入工具/参考文献“Microsoft XML,v6.0”以来?
不,不是。 - 请注意,之前的声明将默认加载 3.0 版本。
然而,绝对最好使用 6.0 版本(如今任何其他版本都已过时!)
当你使用所谓的早期绑定(参考“Microsoft XML,v6.0”),我将执行相同的操作,但指的是当前版本 6.0:
Dim oXml As MSXML2.DOMDocument60 ' declare the xml doc object
Set oXml = New MSXML2.DOMDocument60 ' set an instance of it to memory
中的起始斜杠“/”XPath 表达式始终引用 DocumentElement (<Concepts>
这里),
你可以加.DocumentElement
改为您的文档对象。起始双斜杠“//xyz”将找到任何“xyz”节点(如果存在)。
例如
oXml.SelectNodes("//Query").Length
返回与以下相同的 childNodes 编号(此处:3)
oXml.DocumentElement.SelectNodes("//Query").Length ' or
oXml.SelectSingleNode("//Queries").ChildNodes.Length ' or even
oXml.SelectNodes("/*/*/*/Query").Length`.
参考 XML 版本 6.0 的代码示例
当然,您必须循环访问多个 xml 文件,该示例仅使用一个(从第 2 行开始)。
只是针对不存在的情况格式良好的 xml 文件我添加了详细的错误例程这使您能够识别假定的错误位置。Load
and LoadXML
两者都返回一个布尔值(如果加载正确则返回 True,否则返回 False)。
Sub xmlTest()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(3)
Dim oXml As MSXML2.DOMDocument60
Set oXml = New MSXML2.DOMDocument60
With oXml
.validateOnParse = True
.setProperty "SelectionLanguage", "XPath" ' necessary in version 3.0, possibly redundant here
.async = False
If Not .Load(ThisWorkbook.Path & "\xml\" & "name.xml") Then
Dim xPE As Object ' Set xPE = CreateObject("MSXML2.IXMLDOMParseError")
Dim strErrText As String
Set xPE = .parseError
With xPE
strErrText = "Load error " & .ErrorCode & " xml file " & vbCrLf & _
Replace(.URL, "file:///", "") & vbCrLf & vbCrLf & _
xPE.reason & _
"Source Text: " & .srcText & vbCrLf & vbCrLf & _
"Line No.: " & .Line & vbCrLf & _
"Line Pos.: " & .linepos & vbCrLf & _
"File Pos.: " & .filepos & vbCrLf & vbCrLf
End With
MsgBox strErrText, vbExclamation
Set xPE = Nothing
Exit Sub
End If
' Debug.Print "|" & oXml.XML & "|"
Dim Queries As IXMLDOMNodeList, Query As IXMLDOMNode
Dim Searched As String
Dim i&, ii&
i = 2 ' start row
' start XPath
Searched = "ConceptModel/Queries/Query" ' search string
Set Queries = oXml.DocumentElement.SelectNodes(Searched) ' XPath
'
ws.Cells(i, 1) = IIf(Queries.Length = 0, "No items", Queries.Length & " items")
ii = 1
For Each Query In Queries
ii = ii + 1
ws.Cells(i, ii) = Query.Text
Next
End With
End Sub
附加提示
您可能还对如何列出的示例感兴趣所有子节点通过 XMLDOM 并使用 VBA 从 XML 获取属性名称 https://stackoverflow.com/questions/51887820/obtain-attribute-names-from-xml-using-vba/51919182#51919182.
由于后来的评论,我添加了进一步的提示(感谢@barrowc)
“使用 MSXML v3.0 的另一个问题是默认选择语言是 XSLPatterns 而不是 XPath。
有关 MSXML 版本之间的一些差异的详细信息,请参见here https://blogs.msdn.microsoft.com/xmlteam/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer/并讨论了两种选择语言之间的差异here https://stackoverflow.com/q/2099880/2127508."
在当前的 MSXML2 版本 6.0 中,完全支持 XPath 1.0。所以它看起来XSL 模式微软早期已经实现了,基本上可以看作是W3C标准化XPath之前XPath表达式的简化子集。
MSXML2 版本 3.0 至少允许通过显式选择语言设置来集成 XPath 1.0:
oXML.setProperty "SelectionLanguage", "XPath" ' oXML being the DOMDocument object as used in original post