2010-04-27 14 views
5

Ho un set di classi VBA in un database MS Access. Ho una stringa xml con i dati con cui voglio creare nuove classi.Deserializzazione XML in VB/VBA

Altro che impostare ciascuna proprietà singolarmente, esiste un modo semplice per deserializzare l'XML nel mio oggetto?

Ho visto il codice che utilizza la libreria TypeLib

Public Sub ISerializable_Deserialize(xml As IXMLDOMNode) 

    Dim tTLI As TLIApplication 
    Dim tInvoke As InvokeKinds 
    Dim tName As String 
    Dim tMem As MemberInfo 

    tInvoke = VbLet 

    For Each tMem In TLI.ClassInfoFromObject(Me).Members 

    tName = LCase(tMem.Name) 

    CallByName Me, tMem.Name, VbLet, xml.Attributes.getNamedItem(tName).Text 

    Next tMem 
End Sub 

ma questo non sembra funzionare con i moduli di classe standard. Ottengo un errore 429:

ActiveX Component Cannot Be Created 

Qualcun altro può darmi una mano? Preferirei non dover impostare ogni proprietà a mano se posso aiutarlo, alcune di queste classi sono enormi!

risposta

2

hai mai esempio tTLI in quel codice & e poi fare riferimento ad esso come solo TLI così non funzionerà, l'errore 429 può essere perché la libreria TypeInfo non è registrato, ha fatto si aggiunge come riferimento?

Se avete fatto la seguente funzionerà:

Dim TLI As TLIApplication 
Dim II As InterfaceInfo 
Dim MI As MemberInfo 

Set TLI = New TLIApplication 
Set II = TLI.InterfaceInfoFromObject(Me) 

For Each MI In II.Members 
    If MI.InvokeKind = InvokeKinds.INVOKE_PROPERTYPUT Then 
     Debug.Print MI.Name 
     TLI.InvokeHook Me, MI.Name, InvokeKinds.INVOKE_PROPERTYPUT, "PROPVALUE" 
    End If 
Next 

È possibile sostituire InvokeHook con CallByName se lo si desidera.

+0

Le classi private in un database di Access non sono incluse in nessuna libreria di tipi pubblici, quindi non penso che funzionerà mai, anche con gli errori corretti come suggerito. Non credo che 'InterfaceInfoFromObject (Me)' possa avere successo perché le interfacce rilevanti per 'Me' non sono pubbliche. – MarkJ

+0

InterfaceInfoFromObject funziona tramite IDispatch :: GetTypeInfo() che funziona in Access per me .. come a come .. chi lo sa? –

+0

Grazie Alex. Ancora non funziona, non funziona sul Imposta TLI = Nuova richiesta TLIA riga con lo stesso errore. Ho fatto riferimento al riferimento typelib, (tlbinf32.dll) è quello giusto? Ben. – oharab

Problemi correlati