我有一个vehicle类,我创建了一个vehicle类的集合SelectedVehicle(10),这取决于XML中有多少车辆,我想要将这个XML添加到我的类中,但是在我的对象中,我的属性在每个实例中都有错误的门数量,在这种情况下,一个实例有8个车门和8个窗口,而我的XML在每个对象中有4个。
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发布于 2017-07-13 12:07:49
要正确地将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和Windows成员使用Doors集合可以避免使用固定大小数组的限制。您也可以使用普通的VBScript数组来实现这一点,但是它需要更多的代码。
对车辆使用字典允许通过ID访问集合中的对象。
当然,这只是一个极简的例子。例如,您可能希望在Vehicle类中使用实际属性而不是公共成员变量。您还可能希望添加验证和错误处理例程。
https://stackoverflow.com/questions/45077700
复制相似问题