PEGAR CONTEÚDO COMPLETO DA TAG DO ARQ TXT

SEBFREITAS 21/12/2022 12:38:59
#500907
Bom dia, uso uma função bem simples mas q até então funciona perfeitamente pra pegar uma TAG dentro de um arquivo .txt/.ini
Só que agora preciso fazer o seguinte:

1. Recebo um BUFFER de uma DLL, pego esse BUFFER e gravo num arquivo .TXT
Open "c:\Retorno_Chave_" & txtChave.text & ".txt" For Output As #1
Print #1, Ret
Close #1

2. Preciso abrir esse arquivo e pegar a tag "XML" onde vai está o xml da nota que preciso tratar as informacoes do mesmo:
strXML = ReadINI("ResDFe001", "XML", "c:etorno_Chave_" & strArq & ".txt")

O problema é que a função ReadINI não vem com o conteúdo completo do xml, ou seja, ele não consegue pegar tudo que tá na tag XML.

A função ReadINI:
Public Function ReadINI(Section As String, key As String, FileName As String)
"Filename=nome do arquivo ini
"section=O que esta entre []
"key=nome do que se encontra antes do sinal de igual
Dim retlen As String
Dim Ret As String
Ret = String$(128, 0)

retlen = GetPrivateProfileStringByKeyName(Section, key, "", Ret, 127, FileName)
Ret = Left$(Ret, retlen)

ReadINI = Ret
End Function


Qual seria a forma correta de pegar essa tag completa?
WEBMASTER 21/12/2022 15:41:35
#500909
O ideal seria voce mostrar o conteudo da secao ResDFe001 que tem a chave XML para podermos ajudar...
Me parece que seu conteudo esta gerando o problema.

Alem disso como a doc da função comenta a assinatura:

DWORD GetPrivateProfileString(
[in] LPCTSTR lpAppName,
[in] LPCTSTR lpKeyName,
[in] LPCTSTR lpDefault,
[out] LPTSTR lpReturnedString,
[in] DWORD nSize,
[in] LPCTSTR lpFileName
);

Talvez seu parametro para nSize esteja menor do que esperado (talvez 255)
Experimente alterar Ret para um tamanho maior de alocacao de string
SEBFREITAS 21/12/2022 16:13:40
#500910
Citação:

:
O ideal seria voce mostrar o conteudo da secao ResDFe001 que tem a chave XML para podermos ajudar...
Me parece que seu conteudo esta gerando o problema.

Alem disso como a doc da função comenta a assinatura:


DWORD GetPrivateProfileString(
[in] LPCTSTR lpAppName,
[in] LPCTSTR lpKeyName,
[in] LPCTSTR lpDefault,
[out] LPTSTR lpReturnedString,
[in] DWORD nSize,
[in] LPCTSTR lpFileName
);

Talvez seu parametro para nSize esteja menor do que esperado (talvez 255)
Experimente alterar Ret para um tamanho maior de alocacao de string



Ja tentei aumentar o nSize, so que o conteudo da TAG é muito grande, é um xml de uma nfe. Conforme o arquivo anexo.

Alguma outa função que faca o mesmo papel?

Grato,
WEBMASTER 21/12/2022 17:39:33
#500911
Vixe, esquece
Nao vai rolar, INI não é feito e nem pensado para isso
Faria sentido voce guardar no INI o apontamento para o XML fisico, ou seja, salvar em UMARQUIVO.XML e depois no ini voce grava o caminho para o arquivo, tipo XML = c:\XML\UMARQUIVO.XML
De fato, isso que voce quer fazer nao ha garantias de que o INI tenha capacidade de processar (lembrando, estamos falando de uma funcao do sistema operacional que nasceu para ler parametros em formato string de tamanho curto e nao um arquivo inteiro)
SEBFREITAS 21/12/2022 21:19:50
#500918
Citação:

:
Vixe, esquece
Nao vai rolar, INI não é feito e nem pensado para isso
Faria sentido voce guardar no INI o apontamento para o XML fisico, ou seja, salvar em UMARQUIVO.XML e depois no ini voce grava o caminho para o arquivo, tipo XML = c:XMLUMARQUIVO.XML
De fato, isso que voce quer fazer nao ha garantias de que o INI tenha capacidade de processar (lembrando, estamos falando de uma funcao do sistema operacional que nasceu para ler parametros em formato string de tamanho curto e nao um arquivo inteiro)



Mas o problema é que isso eu recebo justamente para montar o XML da sefaz, ou seja, o xml vem dentro desse arquivo, ai eu teria q gerar o arquivo XML que vem dentro dessa tag. Sem falar que pode vir tambem vários, tipo:


[ResDFe001]
CNPJ=
Id=
XML=
[ResDFe002]
CNPJ=
Id=
XML=

cada seção [ResDFe] seria uma nota fiscal. Teria algum ideia de que forma eu posso fazer? Algo semelhante o MSXML2.DOMDocument que eu pudesse desserializar? Isso seria um processo de desserialização?

Grato,
ALVAROVB2009 22/12/2022 11:29:12
#500920
Eu tenho um sistema onde vou em um servidor e busco um xml dele e coloco em um obj e depois crio na minha máquina um arquivo xml com esses dados e depois faço o tratamento necessário

Set Obj = New MSXML2.ServerXMLHTTP
Obj.Open "GET", "caminho completo até o servidor destino"
Obj.send <- envia o comando

If Obj.Status >= 400 And Obj.Status <= 505 Then
MsgBox "Erro Ocorrido : " & Obj.Status & " - " & Obj.StatusText
Else
Open DiretorioRaiz & NomeNovaPasta & "\arquivo.xml" For Binary Access Write As #1
Put #1, , Obj.responseText <- com a resposta recebida estou criando o arquivo xml
Close #1
End If


Aqui faço a leitura e todo o processo, de onde eu pego, o pessoal chegou a colocar várias tags com nomes iguais para dados destintos , me deu uma dor de cabeça lascada até descobrir a caca deles

Dim InformacaoLinha() As String < - aqui é onde irei colocar todas as linhas do obj
FileNo = FreeFile
Total = 0
Contador = 0
Open caminho & "\arquivo.xml" For Input As FileNo
Do Until EOF(FileNo)
Contador = Contador + 1
ReDim Preserve InformacaoLinha(Contador)
Line Input #FileNo, InformacaoLinha(Contador)
Loop
Close FileNo

Depois que faço todas as buscas, porque são várias vezes que preciso fazer essa busca e em um curto espaço de tempo, tenho todos xml e ai vou tratando sossegado
Pode não ser o processo mais prático, más é o que me atende perfeitamente, pois tenho os xmls da forma que eles liberaram na época e isso já me ajudou e muito a mostrar os erros deles

Pode ser que esse processo não seja o que vc precisa, más ACHO que o caminho seria por aqui
WEBMASTER 22/12/2022 11:42:37
#500921
Bom, reveja a solução pois INI não é feito para isso (guardar um arquivo inteiro em um NÓ).
Talvez um JSON ou um XML seja mais indicado
SEBFREITAS 22/12/2022 11:48:41
#500922
Citação:

:
Eu tenho um sistema onde vou em um servidor e busco um xml dele e coloco em um obj e depois crio na minha máquina um arquivo xml com esses dados e depois faço o tratamento necessário

Set Obj = New MSXML2.ServerXMLHTTP
Obj.Open "GET", "caminho completo até o servidor destino"
Obj.send <- envia o comando

If Obj.Status >= 400 And Obj.Status <= 505 Then
MsgBox "Erro Ocorrido : " & Obj.Status & " - " & Obj.StatusText
Else
Open DiretorioRaiz & NomeNovaPasta & "arquivo.xml" For Binary Access Write As #1
Put #1, , Obj.responseText <- com a resposta recebida estou criando o arquivo xml
Close #1
End If


Aqui faço a leitura e todo o processo, de onde eu pego, o pessoal chegou a colocar várias tags com nomes iguais para dados destintos , me deu uma dor de cabeça lascada até descobrir a caca deles

Dim InformacaoLinha() As String < - aqui é onde irei colocar todas as linhas do obj
FileNo = FreeFile
Total = 0
Contador = 0
Open caminho & "arquivo.xml" For Input As FileNo
Do Until EOF(FileNo)
Contador = Contador + 1
ReDim Preserve InformacaoLinha(Contador)
Line Input #FileNo, InformacaoLinha(Contador)
Loop
Close FileNo

Depois que faço todas as buscas, porque são várias vezes que preciso fazer essa busca e em um curto espaço de tempo, tenho todos xml e ai vou tratando sossegado
Pode não ser o processo mais prático, más é o que me atende perfeitamente, pois tenho os xmls da forma que eles liberaram na época e isso já me ajudou e muito a mostrar os erros deles

Pode ser que esse processo não seja o que vc precisa, más ACHO que o caminho seria por aqui



Valeu mesmo pela dica.
Quando eu já tenho gravado o arquivo xml da nota eu ja consigo abrir e puxar os dados, porém nesse caso os dados vem em forma de uma string gigante que tenho q gravar o arquivo como .xml para depois fazer a leitura do mesmo. Não sei se em c# teria alguma forma de fazer isso mais fácil. Já procurei em VB6 e não achei. Vou analisar seu codigo pra ve se consigo avançar.

Obrigado!
ALVAROVB2009 22/12/2022 16:00:50
#500927
No caso o meu código, eu analiso linha a linha, pois realmente o arquivo vem gigante, o comando Line Input #FileNo, InformacaoLinha(Contador) coloca a linha lida dentro da variável
Dessa forma percorro a variável procurando as tags desejadas, em C# tem sim, más não passei o meu sistema para ele , pois nesse sistema tenho vários tratamentos que preciso fazer caso a conexão falhe e dependendo do erro é uma ação que precisa ser tomada, desde a simples reinicialização da aplicação até apagar algumas coisas do banco de dados antes de reiniciar, como em C# ainda estou engatinhando , não quero fazer isso ainda e também nem sei quais seriam as mensagens de erro apresentadas
SEBFREITAS 28/12/2022 22:32:37
#500938
Citação:

:
No caso o meu código, eu analiso linha a linha, pois realmente o arquivo vem gigante, o comando Line Input #FileNo, InformacaoLinha(Contador) coloca a linha lida dentro da variável
Dessa forma percorro a variável procurando as tags desejadas, em C# tem sim, más não passei o meu sistema para ele , pois nesse sistema tenho vários tratamentos que preciso fazer caso a conexão falhe e dependendo do erro é uma ação que precisa ser tomada, desde a simples reinicialização da aplicação até apagar algumas coisas do banco de dados antes de reiniciar, como em C# ainda estou engatinhando , não quero fazer isso ainda e também nem sei quais seriam as mensagens de erro apresentadas



Entendi. Valeu mesmo pela atenção.
SEBFREITAS 28/12/2022 22:34:10
#500939
Citação:

:
Bom, reveja a solução pois INI não é feito para isso (guardar um arquivo inteiro em um NÓ).
Talvez um JSON ou um XML seja mais indicado



Boa noite, mas no caso se esse arquivo viesse em JSON eu conseguiria mapear todos os nós que são repetidos com vb6?
Página 1 de 2 [11 registro(s)]
Faça seu login para responder