由于您需要超过 255 个字段,因此您必须使用代码来执行此操作。您可以将 XML 加载到 MSXML2.DOMDocument 中,收集节点值的子集,构建 INSERT 语句并执行它。
这是我针对您的样本数据测试的过程。这很丑陋,但它有效。修改 strTagList、strFieldList、strTable 和 cintNumTables 后取消注释 CurrentDb.Execute 行并查看 INSERT 语句。如果要加载的表超过 2 个,请添加额外的 Case 块。
Public Sub Grinner(ByRef pURL As String)
Const cintNumTables As Integer = 2
Dim intInnerLoop As Integer
Dim intOuterLoop As Integer
Dim objDoc As Object
Dim objNode As Object
Dim strFieldList As String
Dim strMsg As String
Dim strSql As String
Dim strTable As String
Dim strTag As String
Dim strTagList As String
Dim strUID As String
Dim strValueList As String
Dim varTags As Variant
On Error GoTo ErrorHandler
Set objDoc = GetXMLDoc(pURL)
Set objNode = objDoc.getElementsByTagName("UID").Item(0)
strUID = objNode.Text
For intOuterLoop = 1 To cintNumTables
Select Case intOuterLoop
Case 1
strTable = "Table1"
strTagList = "Node1,Node2,Node3,AnotherNode1"
strFieldList = "UID, N1, N2, N3, A1"
Case 2
strTable = "Table2"
strTagList = "AnotherNode2,AnotherNode3,SingleNode"
strFieldList = "UID, A2, A3, SN"
Case Else
'oops!
strTable = vbNullString
End Select
If Len(strTable) > 0 Then
varTags = Split(strTagList, ",")
strValueList = "'" & strUID & "'"
For intInnerLoop = 0 To UBound(varTags)
strTag = varTags(intInnerLoop)
Set objNode = objDoc.getElementsByTagName(strTag).Item(0)
strValueList = strValueList & ", '" & _
Replace(objNode.Text, "'", "''") & "'"
Next intInnerLoop
strSql = "INSERT INTO " & strTable & " (" & _
strFieldList & ")" & vbNewLine & _
"VALUES (" & strValueList & ");"
Debug.Print strSql
'CurrentDb.Execute strSql, dbFailOnError
End If
Next intOuterLoop
ExitHere:
Set objNode = Nothing
Set objDoc = Nothing
On Error GoTo 0
Exit Sub
ErrorHandler:
strMsg = "Error " & Err.Number & " (" & Err.Description _
& ") in procedure Grinner"
MsgBox strMsg
GoTo ExitHere
End Sub
Public Function GetXMLDoc(pURL) As Object
' early binding requires reference, Microsoft XML
'Dim objDoc As MSXML2.DOMDocument30
'Dim objParseErr As MSXML2.IXMLDOMParseError
'Set objDoc = New MSXML2.DOMDocument30
' late binding; reference not required
Dim objDoc As Object
Dim objParseErr As Object
Dim strMsg As String
On Error GoTo ErrorHandler
Set objDoc = CreateObject("Msxml2.DOMDocument.3.0")
objDoc.async = False
objDoc.validateOnParse = True
objDoc.Load pURL
If (objDoc.parseError.errorCode <> 0) Then
Set objParseErr = objDoc.parseError
MsgBox ("You have error " & objParseErr.reason)
Set objDoc = Nothing
End If
ExitHere:
Set objParseErr = Nothing
Set GetXMLDoc = objDoc
On Error GoTo 0
Exit Function
ErrorHandler:
strMsg = "Error " & Err.Number & " (" & Err.Description _
& ") in procedure GetXMLDoc"
MsgBox strMsg
Set objDoc = Nothing
GoTo ExitHere
End Function
以下是我发现对 VBA/XML/DOM 有帮助的 4 个链接: