Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Linha no final do XML


Joacir

Pergunta

Olá! Tenho um sistema em VB6 que gera um arquivo de retorno em XML. Utilizo o DomDocument para gerar o XML e foi o que encontrei de mais rápido e prático para gerar o XML.

A geração do arquivo está ok, o problema é que preciso colocar uma linha ao final do XML fora do nó raiz para validação do arquivo XML e não estou conseguindo.

É tipo uma linha de assinatura no final do arquivo para que este seja validado no destino, alguém tem uma idéia?

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

Bom, você não especificou, mas se está usando o VB6, pode fazer o seguinte:

open caminhoxml for append as #1
print #1, hash
close #1

Onde "caminhoxml" é a variável com o caminho completo do seu arquivo XML gerado e "hash" é a variável contendo o hash do conteúdo do arquivo.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Foi a respeito disso que perguntei no primeiro post, já que ao colocar essa linha o arquivo XML não é mais válido (não se pode colocar informações soltas dentro de um XML). Para o arquivo XML ser válido esse hash deveria estar em uma tag ou atributo. Não existe alguma documentação que explique como o hash deve ser incluído?

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi! Até existe documentação, mas, só descreve que tem que haver o hash no final que é a validação de todo o arquivo. Também achei estranho, questionei, mas, como poucos reclamaram. Ficou assim mesmo. Não está solta, está acompanhada de <hash> ... <hash>, mas, está após o fechamento do nó principal;

Link para o comentário
Compartilhar em outros sites

  • 0

Oi! Pior que não dá! Exigências, tem que ser fora do nó principal. É até estranho, já que faz parte do arquivo, deveria ser em um nó específico, mas, sabe como é! Até questionei que assim, sai do padrão, mas, eles só responderam que tem que seguir o que está no manual e lá está que tem que ser assim.

Obrigado e até ...

Link para o comentário
Compartilhar em outros sites

  • 0

Neste sentido não há diferença entre um arquivo XML e um arquivo texto (aliás, o XML é um arquivo texto, assim como um .HTML, .CSS, .BAT, etc., por exemplo). O que muda é como o programa que lê esse arquivo irá interpretá-lo. Então, mesmo que tenha que ser fora do nó principal, apesar de sair do padrão para você abrir em um determinado editor/visualizador de XML, o programa de destino *pode* realizar a tarefa de ler o arquivo mesmo assim. Tudo vai depender de como esse programa de destino trata o arquivo. Por exemplo, eu recebo um arquivo de um fornecedor que, apesar de parecer um XML, tem partes fora do padrão e não poderia ser lido diretamente como tal. O que meu programa faz com esse arquivo é retirar essas partes fora do padrão (que não me interessam) e adequá-lo (trocar nomes das tags, cujo início e fim são diferentes no original) como se fosse um XML. Feito isso, leio ele normalmente como um XML, importando os dados que me interessam. Então, você tem que ver como esse programa de destino trata o arquivo enviado e qual é exatamente o erro.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi! Excelente sua interpretação. Mas, no caso do meu problema, o arquivo gerado sem a linha final, abre no ie, notepad ou editor xml identado certinho como arquivo XML, mas, quando coloco a linha no final pelo comando print, fica todo bagunçado e aí só me retornaram que o arquivo estava fora do padrão e para eu confirmar, era só abrir pelo notepad e ver que estava tudo bagunçado. Aí fiquei sem ação, não sei o que fazer. Quer dizer, até sei, tenho que migrar este sistema para .Net, mas, estou sem tempo e o cliente precisa desta alteração para ontem. Agora, não sei se em .Net também não teria este problema.

Obrigado e até ...

Link para o comentário
Compartilhar em outros sites

  • 0

Hummm, então pode ser só uma questão de codificação do arquivo. Normalmente os arquivos gerados agora são UTF-8 e esse Print do VB6 deve ser ANSI (porque na época o Unicode ainda não era amplamente usado). Se você tiver como usar .NET para inserção desta linha do hash provavelmente não terá esse problema, já que nele há como abrir e salvar o arquivo em Unicode. Se quiser um exemplo de como fazer isso em .NET tenho como te ajudar.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá! Então, eu não faço ideia de qual versão .NET utilizar, mas, se puder me ajudar, será que seria possível uma DLL que recebesse o arquivo e o hash e inserisse no final? Só falta arredondar este pequeno detalhe do arquivo para que possa ter sossego e começar a migrar o sistema em uma versão mais atual do VB.Net ou ainda partir para C#. Segue abaixo um exemplo de como estou fazendo para você ter uma idéia melhor. Estive verificando que mesmo o arquivo sem a linha no final ao abrir com o notepad ele abre bagunçado.

Obrigado e até ...

Dim xml As New DOMDocument
Dim PrimeiroNo As IXMLDOMElement
Dim SegundoNo As IXMLDOMElement
Dim TerceiroNo As IXMLDOMElement
Dim QuartoNo As IXMLDOMElement
Dim Cabec, CampoDoNo As IXMLDOMElement
'Cria o elemento raíz
Set PrimeiroNo = xml.createElement("PrimeiroNo") 'Abre o primeiro nó.
Call PrimeiroNo.setAttribute("xmlns", "NamespaceDoPrimeiroNo") 'Define o atributo do namespace.
Call xml.appendChild(PrimeiroNo) 'Carrega o primeiro nó.
'Define a declaração inicial do xml.
Set Cabec = xml.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
xml.insertBefore Cabec, PrimeiroNo
Set SegundoNo = xml.createElement("SegundoNo") 'Abre o segundo nó.
Set CampoDoNo = xml.createElement("Campo1doSegundoNo") 'Cria o campo do segundo nó
CampoDoNo.Text = "Valor do Campo 1 doSegundoNo": Call SegundoNo.appendChild(CampoDoNo)
Set CampoDoNo = xml.createElement("Campo2doSegundoNo")
CampoDoNo.Text = "Valor do campo 2 do SegundoNo": Call SegundoNo.appendChild(CampoDoNo)
Set CampoDoNo = xml.createElement("Campo3doSegundoNo")
CampoDoNo.Text = "Valor do campo 3 do SegundoNo": Call SegundoNo.appendChild(CampoDoNo)
Set TerceiroNo = xml.createElement("TerceiroNo") 'Abre o terceiro nó.
Set CampoDoNo = xml.createElement("Campo1doTerceiroNo") 'Cria o campo do terceiro nó
CampoDoNo.Text = "Valor do campo 1 Do TerceiroNo": Call TerceiroNo.appendChild(CampoDoNo)
Set CampoDoNo = xml.createElement("Campo2doTerceiroNo")
CampoDoNo.Text = "Valor do campo 2 Do TerceiroNo": Call TerceiroNo.appendChild(CampoDoNo)
Set QuartoNo = xml.createElement("QuartoNo") 'Abre o quarto nó.
Set CampoDoNo = xml.createElement("Campo1doQuartoNo") 'Cria o campo do quarto nó
CampoDoNo.Text = "Valor do campo 1 Do QuartoNo": Call QuartoNo.appendChild(CampoDoNo)
Call TerceiroNo.appendChild(QuartoNo) 'Finaliza o quarto nó.
Call SegundoNo.appendChild(TerceiroNo) 'Finaliza o terceiro nó.
Call PrimeiroNo.appendChild(SegundoNo) 'Finaliza o segundo no e o documento xml.
xml.Save ("c:\TESTEXMLVB6.xml") 'Salva no local especificado.
open "c:\TESTEXMLVB6.xml" for append as #1
print #1, hash
close #1
Link para o comentário
Compartilhar em outros sites

  • 0

Sim, dá pra fazer um executável que receba como parâmetros o arquivo e o hash para fazer isso (uma DLL não seria o ideal porque integrar o VB6 com DLLs .net é uma parada meio complicada). De qualquer maneira, fiz o exemplo abaixo com o Visual Studio 2013:

Dim xmlDoc As New Xml.XmlDocument()
Dim campodoNó As Xml.XmlElement

Dim primeiroNó, segundoNó, terceiroNó, quartoNó As Xml.XmlElement

primeiroNó = xmlDoc.CreateElement("PrimeiroNo")
primeiroNó.SetAttribute("xmlns", "NamespaceDoPrimeiroNo")

segundoNó = xmlDoc.CreateElement("SegundoNo")

campodonó = xmldoc.CreateElement("Campo1doSegundoNo")
campodoNó.InnerText = "Valor do Campo 1 do SegundoNo"
segundoNó.AppendChild(campodoNó)

campodoNó = xmlDoc.CreateElement("Campo2doSegundoNo")
campodoNó.InnerText = "Valor do Campo 2 do SegundoNo"
segundoNó.AppendChild(campodoNó)

campodoNó = xmlDoc.CreateElement("Campo3doSegundoNo")
campodoNó.InnerText = "Valor do Campo 3 do SegundoNo"
segundoNó.AppendChild(campodoNó)

terceiroNó = xmlDoc.CreateElement("TerceiroNo")

campodoNó = xmlDoc.CreateElement("Campo1doTerceiroNo")
campodoNó.InnerText = "Valor do Campo 1 do TerceiroNo"
terceiroNó.AppendChild(campodoNó)

campodoNó = xmlDoc.CreateElement("Campo2doTerceiroNo")
campodoNó.InnerText = "Valor do Campo 2 do TerceiroNo"
terceiroNó.AppendChild(campodoNó)

quartoNó = xmlDoc.CreateElement("QuartoNo")

campodoNó = xmlDoc.CreateElement("Campo1doQuartoNo")
campodoNó.InnerText = "Valor do Campo 1 do QuartoNo"
terceiroNó.AppendChild(campodoNó)

terceiroNó.AppendChild(quartoNó)
segundoNó.AppendChild(terceiroNó)
primeiroNó.AppendChild(segundoNó)

xmlDoc.AppendChild(xmlDoc.CreateProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"))
xmlDoc.AppendChild(primeiroNó)

Dim arq As String = "c:\temp\TesteXMLVBnet.xml"
xmlDoc.Save(arq)

Dim hash As String = xmlDoc.InnerXml.GetHashCode().ToString() 'Não sei como é o seu cálculo de hash, então usei o nativo baseado em uma string

Dim sw As New IO.StreamWriter(arq, True)
sw.WriteLine() 'Pula uma linha, pois no final do arquivo gerado acima não tem o final de linha
sw.WriteLine(hash)
sw.Close()

Repare que não é muito diferente do VB6, só é mais padronizado e utiliza bibliotecas nativas (não há necessidade de fazer referência nenhuma a outra DLL, para poder gerar arquivos XML).

Mas, se quiser, instala o VS2012 ou 2013 que a gente vê essa parada de adicionar a linha do hash por meio de um executável.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi! Realmente não é complicado! Até daria para fazer esta geração de arquivo em VS2012 ou 2013, só que nem sei como é, principalmente para abrir um banco de dados access que é onde tenho todas as informações para a geração do arquivo. Mas vou ver para instalar um deles e trabalhar na questão de abrir o arquivo, receber o hash e só salvar o arquivo. Para gerar o HASH uso o MD5, que foi o solicitado e consegui via net, uma DLL que faço referência no projeto e aí é só chamar com o texto;

Agora, não entendo por que o arquivo nem no notepad não abre formatado direitinho.

Muito obrigado, tudo de bom e até ...

Joacir

Link para o comentário
Compartilhar em outros sites

  • 0

Olá! Instalei o Visual Studio 2013 e fiz testes com o exemplo que passou acima e não sei se funcionou. Se abri o XML sem a linha que grava como texto a formatação no browser fica normal de arquivo XML, porém, com a linha salva como texto, fica desconfigurado. 

Se isso funcionasse, como faria no caso de já ter o arquivo XML pronto em VB6, ou seja, faria uma rotina no Visual Studio 2013 para abrir o XML, abriria um arquivo texto que teria a linha do HASH final e salvar esta linha no arquivo XML? 

 

Obrigado e até ...

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...