我有一个车辆类,我已经创建了一个车辆类SelectedVehicle(10)
的集合。根据我想要将XML添加到我的类中的XML数量,但在我的对象中,我的属性有在这种情况下,每个门的错误数量,当我的XML在每个对象中有4个时,一个实例有8个门和8个窗口。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Vehicles>
<Vehicle Id="V9">
<Doors>
<Door>Door10</Door>
<Door>Door11</Door>
<Door>Door12</Door>
<Door>Door13</Door>
</Doors>
<Windows>
<Window Id="Win10">Window0</Window>
<Window Id="Win11">Window1</Window>
<Window Id="Win12">Window2</Window>
<Window Id="Win13">Window3</Window>
</Windows>
</Vehicle>
<Vehicle Id="V19">
<Doors>
<Door>Door10</Door>
<Door>Door11</Door>
<Door>Door12</Door>
<Door>Door13</Door>
</Doors>
<Windows>
<Window Id="Win10">Window0</Window>
<Window Id="Win11">Window1</Window>
<Window Id="Win12">Window2</Window>
<Window Id="Win13">Window3</Window>
</Windows>
</Vehicle>
</Vehicles>
VBScript代码:
Class Vehicle
Dim Doors(10)
Dim Windows(10)
End Class
Sub LoadGame(ByRef selectedGame)
Dim Root, NodeListr
Set objXMLDoc = CreateObject("Microsoft.XMLDOM")
objXMLDoc.Async = False
objXMLDoc.Load("C:\Audits.xml")
For i = 0 To UBound(selectedVehicle)
Set xmlVs = objXMLDoc.DocumentElement.SelectNodes("//Door")
For j = node To UBound(xmlVs)
SelectedVehicle(i).Doors = handleNode(node)
Next
Set xmlWindows = _objXMLDoc.DocumentElement.SelectNodes("//Window")
Dim i : i = 0
For f To UBound(xmlWindows)
SelectedVehicle(i).Doors = handleNode(node)
Next
Next
End Sub
Function handleNode(node)
For Each elem In node.ChildNodes
Select Case node.TagName
Case "Window"
handleNode = elem.Text
Case "Door"
handleNode = elem.Text
End Select
Next
End Function
答案 0 :(得分:1)
要将XML数据结构正确反序列化为对象,您的类定义必须与XML结构匹配。由于XML数据中的<Vehicle>
个节点具有id
属性以及<Doors>
和<Windows>
个集合子节点,因此您的类定义应该看起来像这样:
Class Vehicle
Public ID
Public Doors
Public Windows
Private Sub Class_Initialize
Set Doors = CreateObject("System.Collections.ArrayList")
Set Windows = CreateObject("System.Collections.ArrayList")
End Sub
End Class
然后您可以像这样处理XML数据:
Set vehicles = CreateObject("Scripting.Dictionary")
For Each n In objXMLDoc.SelectNodes("//Vehicle")
Set v = new Vehicle
v.ID = n.GetAttribute("Id")
For Each cn In n.SelectNodes("./Doors/Door")
v.Doors.Add cn.Text
Next
For Each cn In n.SelectNodes("./Windows/Window")
v.Windows.Add cn.Text
Next
vehicles.Add v.ID, v
Next
为ArrayList
和Doors
成员使用Windows
个集合可避免使用固定大小数组的限制。您也可以使用普通的VBScript数组执行此操作,但这需要更多代码。
使用车辆字典允许通过ID访问该集合中的对象。
当然这只是一个非常简约的例子。例如,您可能希望在Vehicle
类中使用实际属性而不是公共成员变量。您可能还想添加验证和错误处理例程。