Página 1 de 2

Percorrer um XML

Enviado: 01 Jun 2016 02:08
por marcos.gurupi
Caros, preciso percorrer um arquivo XML. Peguei um exemplo aqui no forum mas nao esta dando certo. Gostaria que alguem me desse uma luz, o q estou fazendo errado. Segue abaixo os detalhes:

Arquivo XML:

Código: Selecionar todos

<?xml version="1.0"?>
<xml>
  <exportacao>
    <itens id="0001">
      <ecnpj>19448850000185</ecnpj>
      <prevenda>4407</prevenda>
      <codproduto>0000071</codproduto>
      <ean></ean>
      <descricao>PRODUTO PADRAO DO SISTEMA 2</descricao>
      <unidade>UN</unidade>
      <quant>2</quant>
      <vlrunit>98</vlrunit>
      <totalitem>196</totalitem>
      <codtrib>03</codtrib>
      <ncm>95049090</ncm>
      <cest></cest>
    </itens>
    <itens id="0002">
      <ecnpj>19448850000185</ecnpj>
      <prevenda></prevenda>
      <codproduto>0000072</codproduto>
      <ean></ean>
      <descricao>PRODUTO PADRAO DO SISTEMA 3</descricao>
      <unidade>UN</unidade>
      <quant>5</quant>
      <vlrunit>9</vlrunit>
      <totalitem>45</totalitem>
      <codtrib>03</codtrib>
      <ncm>85176262</ncm>
      <cest>2111000</cest>
    </itens>
  </exportacao>
</xml>
Com o codigo abaixo eu apenas estou pegando o primeiro item.

Código: Selecionar todos

   cStr := fOpen( cArq )
   oXML := TXMLDocument():New( cStr, HBXML_STYLE_NOESCAPE ) 
    IF oXML:nError != HBXML_ERROR_NONE 
        Msgstop( "xml com problema " + Str( oXML:nError ) ) 
		MonitorExecuta := 1
		Select(Areant)
		RETURN 
   ENDIF 

   oPedido := oXML:findfirst( "itens" ) 
   IF oPedido == NIL 
      Msgstop( "TAG itens não localizada." ) 
      MonitorExecuta := 1
      Select(Areant)
		RETURN 
   ENDIF 
   oIterator := TXmlIterator():New( oPedido )
   DO WHILE .T.
      DO WHILE .T. 
         oCurrent := oIterator:Next() 
         IF oCurrent == NIL 
            EXIT 
         ELSE 
         IF oCurrent:cName == "ecnpj" 
               veCNPJ := oCurrent:cData
         ELSEIF oCurrent:cName == "prevenda" 
               vPreVenda := oCurrent:cData
         ELSEIF oCurrent:cName == "codproduto" 
               vcodproduto := oCurrent:cData 
         ELSEIF oCurrent:cName == "ean" 
               vean := oCurrent:cData 
         ELSEIF oCurrent:cName == "descricao" 
               vdescricao := oCurrent:cData  
               msginfo(vDescricao)
            ELSEIF oCurrent:cName == "unidade" 
               vunidade := oCurrent:cData
            ELSEIF oCurrent:cName == "quant" 
               vquant := oCurrent:cData
            ELSEIF oCurrent:cName == "vlrunit" 
               vVlrUnit := oCurrent:cData
            ELSEIF oCurrent:cName == "totalitem" 
               vtotalitem := oCurrent:cData
            ELSEIF oCurrent:cName == "codtrib" 
               vcodtrib := oCurrent:cData
            ENDIF 
         Endif
   ENDDO
  oPedido := oXML:findnext( "itens" ) 
  If oPedido == NIL 
      exit 
  EndIf 
Enddo

Percorrer um XML

Enviado: 01 Jun 2016 08:10
por Wanderlei
Bom dia Marcos,
Este exemplo peguei aqui no forum.
LerXmlNFe.prg
(12.84 KiB) Baixado 643 vezes

Percorrer um XML

Enviado: 01 Jun 2016 09:00
por Toledo
Apenas para complementar a mensagem do Wanderlei, veja no tópico abaixo um outro exemplo:

https://pctoledo.org/forum/viewto ... 685#p62685

- Neste exemplo altere a linha 2 com o caminho e nome do seu arquivo xML.

- Na linha 7 troque "det" por "itens".

- Das linhas 12 até 24, troque por:

Código: Selecionar todos

veCNPJ:= oXmlDetPro:find( 'ecnpj' ):cData
vPreVenda:= oXmlDetPro:find( 'prevenda' ):cData
vcodproduto:= oXmlDetPro:find( 'codproduto' ):cData
etc...
Se for necessário verificar se uma tag existe, antes de pegar o seu valor, veja as linhas 22, 23 e 24.

Abraços,

Percorrer um XML

Enviado: 01 Jun 2016 19:23
por JoséQuintas
Veja se facilita.

Postei tempos atrás uma funçãozinha que ajuda no caso de XMLs, uma pra gerar e outra pra ler.
Se souber o formato do XML, acho mais prático por ela do que por outro método.

Pense no seguinte..... o XML é separado em blocos, cada bloco tem <bloco></bloco>, e também blocos dentro de blocos.
Pra encontrar um bloco, é pesquisar de "<bloco" até "</bloco>"

Então basta uma simples função que localize o início/fim do bloco, e separe o bloco.
( Estou digitando e criando durante o post, é aproximadamente o que deveria ser, mas pode conter erro )

Código: Selecionar todos

FUNCTON XmlNode( cXml, cBloco )
   cText := cXml
   nInicio := At( "<" + cBloco, cText )
   cText := Substr( cText, nInicio )
   nFim := At( "</" + cBloco + ">", cText )
   cText := Substr( cText, 1, nFim + Len( cBloco ) + 3 )
   RETURN cText
A partir daí, só usar.
Exemplo:

Código: Selecionar todos

cXmlEmitente := XmlNode( cXml, "emitente" )
   cNome      := XmlNode( cXmlEmitente, "nome" )
   cEndereco := XmlNoce( cXmlEmitente, "endereco"
   cCidade    := XmlNode( cXmlEmitente, "cidade" )

cXmlDestinatario := XmlNode( cXml, "destinatario" )
   cNome := XmlNode( cXmlDestinatario, "nome" )
   cEndereco := XmlNode( cXmlDestinatario, "endereco" )
   cCidade    := XmlNode( cXmlDestinatario, "cidade" )
Lógico... tem os casos de <nota id=dsfdfdf versao=fdjfjdsfd>
Vai ajustando a rotina até resolver as variações, incluindo a de pegar apenas o conteúdo entre as tags, sem os delimitadores <bloco></bloco>

Percorrer um XML

Enviado: 02 Jun 2016 17:10
por alxsts
Olá!

Pessoalmente prefiro usar a classe TXmlDocument() e seus métodos. É mais seguro pois ao carregar o XML ela já verifica a integridade do mesmo, retornando um atributo que pode ser testado. Além disto, trata todas as situações que teriam que ser tratadas em uma rotina própria, inclusive tags vazias, do tipo <tag/> (não tem a tag de aberturam somente a de fechamento). Enfim, é reinventar a roda...

Percorrer um XML

Enviado: 02 Jun 2016 19:01
por JoséQuintas
Se considerar que o Windows já tem isso há muito tempo, quando criaram TXmlDocument() também reinventaram a roda.

Eu já usava isso no tempo do Clipper, importando notas de fornecedor, então não havia nada pronto.

Existem muitos editores de texto, muitas linguagens de programação, LIBs gráficas pro Harbour, IDEs pro Harbour, ...
Existe Harbour 3.2, 3.4, xHarbour.... distribuições Linux...
No final, reinventar a roda é muito comum.

E tem certos casos onde reinventam uma roda quadrada,,, faz parte.

Percorrer um XML

Enviado: 04 Jun 2016 09:02
por marcos.gurupi
Bom dia!
Pra encerrar o tópico. Gostaria de dizer que o problema estava no meu cdigo fonte. Em itens de pedido eu estava condicionando a inclusao de um novo item se n existisse o numero do pedido cadastrado. Isso fazia com que o sistema so incluise 1 item de kda pedido. Depois dessa pisada na bola foi tudo de primeira. Obr a todos pelas colaborações!

Percorrer um XML

Enviado: 20 Nov 2016 11:55
por Mario Mesquita
Bom dia, pessoal.

Dei up no post pois estou pesquisando a melhor forma de ler um XML e gravar num DBF.

A ideia do Quintas é interessante, mas creio que necessite de experiencia em tratar o formato, como foi dito, em caso de elementos vazios, etc. Nesse caso, a TXMLDOCUMENT pode ser melhor se não se tem prática com o XML.

Para usar a classe precisa de algum include ou algo assim? Pra variar, a pouca e não muito clara documentação do Harbour dificulta um pouco. Num velho tutorial de xHarbour, um exemplo de rotina tem uma linha:

#include "hbXml.ch"

Para o Harbour isso ainda é necessário?

Quem tiver alguma dica, desde já agradeço.

Saudações e bom domingo a todos,
Mario.

Percorrer um XML

Enviado: 20 Nov 2016 13:11
por JoséQuintas
XmlNode() é apenas uma função.

Tem uma classe na sefazclass pra ajudar no que quer fazer.

Importante:
pra entender um pouco o uso de XmlNode(), vá direto na FUNCTION XmlToDocNfeEmi().
Ela faz bastante uso de XmlNode()

https://github.com/JoseQuintas/sefazcla ... lClass.prg

De uma forma geral, essa classe na SefazClass é com tudo pronto, pra fazer algo assim:

Código: Selecionar todos

oDoc := XmlToDoc( MemoRead( "arquivo.xml" ) )
? oDoc:Emitente:Nome
? oDoc:Emitente:CNPJ

Percorrer um XML

Enviado: 20 Nov 2016 14:58
por Mario Mesquita
Boa tarde a todos.

Quintas, que legal, uma classe completa pra tratar XML. Bom pra estudar XML e como trabalhar com classes de objeto.

Não trabalho muito com classes, ranço do Clipper acho. É bom ver quem sabe. Muito obrigado!

Fazendo uns testes aqui com o TXmlDocument() pra ver como ia ser. Acho que ele funcionou, mas deu um erro de array, talvez eu tenha errado o nome de algum elemento, vou conferir e reporto como foi.

Estou tentando jogar direto num Grid. Tá meio tosco, mas vamos ver se isso resolve.

Novamente, obrigado por compartilhar seu conhecimento.

Abraço,
Mario.

Percorrer um XML

Enviado: 22 Nov 2016 10:11
por Mario Mesquita
Bom dia a todos.

Amigos, consegui fazer a leitura do XML pelo método TXMLDocument() e pôr os dados em um Grid para posterior gravação em uma tabela.

Obrigado pelas dicas e passando a correria, vou ler mais sobre XML, que ao visto será cada vez mais usado em troca de informações.

Abraços,
Mario.

Percorrer um XML

Enviado: 22 Nov 2016 12:14
por rubens
Mário tem jeito de postar um exemplo do código aí?
Tô trabalhando justamente nisso...

Obrigado

Percorrer um XML

Enviado: 22 Nov 2016 18:33
por janio
Eu uso a classe do Quintas para LER xml de FORNECEDOR!

Muuuuito facil!

viewtopic.php?f=54&t=17413&start=15

Janio

Percorrer um XML

Enviado: 23 Nov 2016 07:16
por Jairo Maia
Jânio, acho que o link que você postou não tem nada a ver com o que está sendo discutido aqui não. Aqui está sendo discutido a leitura e extração de informação do XML, por exemplo: ler o XML de compra, e verificar se houve alteração no valor de custo do item, atualizar estoque pegando a quantidade, se o produto não está cadastrado cadastrar e já com os dados fiscais com base no CFOP e CST/CSOSN, etc...

Também estou trabalhando nisso (extrair dados do XML). Por isso seria interessante se o Mário postasse o que conseguiu, talvez ajude.

Percorrer um XML

Enviado: 23 Nov 2016 08:04
por rubens
Bom dia...

Eu já faço assim em harbour e lendo o xml com memoread... Mas com a classe creio que fica muito melhor ...
Agora tô implantando em Minigui com a opção de baixar o xml pela chave.
Do jeito que já faço em harbour inclusive o sped já fica quase pronto...
LeXML.prg
(31.58 KiB) Baixado 587 vezes
Rubens