IMPORTAR FICHEIRO XML

FILIPA 24/05/2013 09:02:00
#423968
OI
PRECISO DE UMA AJUDA...
ALGUéM ME ARRANJA UM EXEMPLO DE UMA IMPORTAÇÃO DE UM FICHEIRO EM XML PARA SER LIDO EM VB.6 E APRESENTAR O RESULTADO???
AGRADECIDA
PROFESSOR 26/05/2013 17:54:55
#424048
Bom, você pode usar uma função como esta abaixo (baseada no MSDN):

Public Function XmlParaRecordset(ByVal sXML As String) As Recordset
On Error GoTo Hell:
Dim ret As New ADODB.Recordset
Dim oStr As New ADODB.Stream
oStr.Open
oStr.WriteText sXML [ô]Carrega o conteúdo do texto XML no objeto Stream.
oStr.Position = 0 [ô]Posiciona o ponteiro no início do Stream.
ret.Open oStr [ô]Carrega agora o conteúdo do Stream no Recordset.
oStr.Close [ô]Encerra o Stream, para o arquivo (memória) ser liberado.
Set oStr = Nothing
Set XmlParaRecordset = ret [ô]Retorna o Recordset
Set ret = Nothing
End Function


Pessoalmente, para XML, eu costumava usar rotinas um pouco diferentes, sem um ADODB.Stream.
Como o Recordset ADO 2.8 pode ler XML diretamente, mas requer um modelo com o tipo esquema (RowsetSchema) embutido, eu fazia algo como no exemplo á seguir:


Option Explicit

Private Sub Command1_Click()
Dim rs As New ADODB.Recordset
Dim arq As String
arq = App.Path & [Ô]\meuXisEmeEle.xml[Ô]
CriaRecordset rs
If Me.SalvaComoXML(rs, arq) = True Then
If Me.CarregaDoXML(arq, rs) = True Then MsgBox rs.RecordCount
End If
End Sub

Public Function CarregaDoXML(ByVal arq As String, _
ByRef rs As ADODB.Recordset) As Boolean
On Error GoTo hell:
Dim ret As Boolean
If Not (rs Is Nothing) Then
If rs.State <> adStateClosed Then rs.Close
End If
Set rs = New ADODB.Recordset
If Dir(arq) <> [Ô][Ô] Then
rs.Open arq, [Ô]Provider=MSPersist;[Ô], adOpenForwardOnly, adLockReadOnly, adCmdFile
ret = True
End If
GoTo sai:
hell:
ret = False
If (Err.Number <> 0) Then
Set rs = New ADODB.Recordset
MsgBox Err.Description
Err.Clear
End If
sai:
CarregaDoXML = ret
End Function

Public Function SalvaComoXML(ByRef rs As ADODB.Recordset, _
ByVal arq As String) As Boolean
On Error GoTo hell:
Dim ret As Boolean
Dim fso As New Scripting.FileSystemObject
If (fso.FileExists(arq) = True) Then fso.DeleteFile arq
rs.Save arq, adPersistXML
ret = True
GoTo sai:
hell:
ret = False
If (Err.Number <> 0) Then
MsgBox Err.Description
Err.Clear
End If
sai:
SalvaComoXML = ret
End Function


Private Sub CriaRecordset(ByRef rs As ADODB.Recordset)
With rs
.Fields.Append [Ô]Id[Ô], adBigInt, , adFldKeyColumn
.Fields.Append [Ô]Nome[Ô], adVarChar, 100
.Open
Adiciona rs, 1, [Ô]José[Ô]
Adiciona rs, 10, [Ô]Antônio[Ô]
Adiciona rs, 5, [Ô]Pedro[Ô]
Adiciona rs, 65, [Ô]Ataúlfo[Ô]
Adiciona rs, 8, [Ô]Maneco[Ô]
Adiciona rs, 50, [Ô]Gustavo[Ô]
Adiciona rs, 66, [Ô]Silas[Ô]
Adiciona rs, 32, [Ô]Marcos[Ô]
Adiciona rs, 12, [Ô]Virgílio[Ô]
End With
End Sub
Private Sub Adiciona(ByRef rs As ADODB.Recordset, _
ByVal id As Long, _
ByVal nome As String)
With rs
.AddNew
.Fields(0) = id
.Fields(1) = nome
.UpdateBatch adAffectAllChapters
End With
End Sub


Mas nem sempre você irá ler arquivos XML gerados por outras aplicações VB6, e nestes casos, o modelo de esquema pode atrapalhar bastante.

Caso o modelo de XML tenha sido gerado por algum componente ou aplicativo .Net, ou outras plataformas atuais, o VB6 sozinho é obsoleto. Assim, você precisará utilizar o DOM Document (que você deve referenciar em seu projeto - MSXML 3 á 6), o que torna a tarefa um pouco mais complexa, mas ainda assim, factível e de rápida execução.

Para este caso, dê uma boa olhada neste link, que inclui um bom exemplo e seu código-fonte.

Observe ainda que a MDAC, responsável pelos Streams e pelos modelos de acesso á dados, não é mais um [Ô]padrão universal[Ô], uma vez que á partir do Windows Vista, o sistema operacional passou á contar com a Windows DAC. Assim, sobretudo à partir do SP1 do Windows 7, você pode encontrar incompatibilidades.

Tópico encerrado , respostas não são mais permitidas