如何将XML从文件解除序列化到对象集合

时间:2017-07-13 10:14:52

标签: xml xpath vbscript

我有一个车辆类,我已经创建了一个车辆类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

1 个答案:

答案 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

ArrayListDoors成员使用Windows个集合可避免使用固定大小数组的限制。您也可以使用普通的VBScript数组执行此操作,但这需要更多代码。

使用车辆字典允许通过ID访问该集合中的对象。

当然这只是一个非常简约的例子。例如,您可能希望在Vehicle类中使用实际属性而不是公共成员变量。您可能还想添加验证和错误处理例程。