首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将XML从文件降为对象的集合

如何将XML从文件降为对象的集合
EN

Stack Overflow用户
提问于 2017-07-13 10:14:52
回答 1查看 44关注 0票数 1

我有一个vehicle类,我创建了一个vehicle类的集合SelectedVehicle(10),这取决于XML中有多少车辆,我想要将这个XML添加到我的类中,但是在我的对象中,我的属性在每个实例中都有错误的门数量,在这种情况下,一个实例有8个车门和8个窗口,而我的XML在每个对象中有4个。

XML:

代码语言:javascript
复制
<?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代码:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 12:07:49

要正确地将XML数据结构反序列化为对象,类定义必须与XML结构匹配。由于XML数据中的<Vehicle>节点具有id属性以及<Doors><Windows>集合子节点,所以类定义应该类似于以下内容:

代码语言:javascript
复制
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数据:

代码语言:javascript
复制
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

ArrayListWindows成员使用Doors集合可以避免使用固定大小数组的限制。您也可以使用普通的VBScript数组来实现这一点,但是它需要更多的代码。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45077700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档