PEGAR CONTEÚDO COMPLETO DA TAG DO ARQ TXT
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?
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
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,
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)
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,
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
Talvez um JSON ou um XML seja mais indicado
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!
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
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.
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?