Rotinas pra XML

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotinas pra XML

Mensagem por JoséQuintas »

Sei que tem rotinas no Harbour para XML, mas eu venho utilizando algumas que criei no tempo do Clipper, e estou postando aqui.
Como cada um prefere de uma forma, pode ser que interesse pra alguém.

Código: Selecionar todos

// exemplo de uso. Não tem a classe oNfe aqui, mas o objetivo é mostrar o XmlNode() pra extrair dados no XML de NFe.
// e deixando a classe dá pra saber do que se trata o campo
// Só com ela já dá pra importar notas de fornecedores.
// Notem que o trabalho maior não é a função, e sim a quantidade de campos, aqui só tem uma pequena parte
// O Harbour tem função equivalente a AtStart(), mas na época fiz em Clipper.

XmlInput := MemoRead("nfe.xml")

mXmlNode1 = XmlNode(XmlInput, "emit")
   oNfe:Emitente:Cnpj = Transform(XmlNode(mXmlNode1, "CNPJ"), "@R 99.999.999/9999-99")
   oNfe:Emitente:Nome = Upper(XmlNode(mXmlNode1, "xNome"))
   oNfe:Emitente:InscricaoEstadual = XmlNode(mXmlNode1, "IE")
   mXmlNode2 = XmlNode(mXmlNode1, "enderEmit")
      oNfe:Emitente:Endereco = Upper(XmlNode(mXmlNode2, "xLgr"))
      oNfe:Emitente:Numero = XmlNode(mXmlNode2, "nro")
      oNfe:Emitente:Compl = XmlNode(mXmlNode2,"xCpl")
      oNfe:Emitente:Bairro = Upper(XmlNode(mXmlNode2, "xBairro"))
      oNfe:Emitente:CidadeIbge = XmlNode(mXmlNode2, "cMun")
      oNfe:Emitente:Cidade = Upper(XmlNode(mXmlNode2, "xMun"))
      oNfe:Emitente:Uf = Upper(XmlNode(mXmlNode2, "UF"))
      oNfe:Emitente:Cep = Transform(XmlNode(mXmlNode2, "CEP"), "@R 99999-999")
      oNfe:Emitente:Telefone = XmlNode(mXmlNode2, "fone")

mXmlNode1 = XmlNode(XmlInput, "dest")
   oNfe:Destinatario:Cnpj = XmlNode(mXmlNode1, "CNPJ")
   If Len(Trim(oNfe:Destinatario:Cnpj)) = 0 
      oNfe:Destinatario:Cnpj = XmlNode(mXmlNode1, "CPF")
      oNfe:Destinatario:Cnpj = Transform(oNfe:Destinatario:Cnpj, "@R 999.999.999-99")
   Else
      oNfe:Destinatario:Cnpj = Transform(oNfe:Destinatario:Cnpj, "@R 99.999.999/9999-99")
   EndIf
   oNfe:Destinatario:Nome = Upper(XmlNode(mXmlNode1, "xNome"))
   oNfe:Destinatario:InscricaoEstadual = XmlNode(mXmlNode1, "IE")
   mXmlNode2 = XmlNode(mXmlNode1, "enderDest")
      oNfe:Destinatario:Endereco = Upper(XmlNode(mXmlNode2, "xLgr"))
      oNfe:Destinatario:Numero = XmlNode(mXmlNode2, "nro")
      oNfe:Destinatario:Compl = XmlNode(mXmlNode2, "xCpl")
      oNfe:Destinatario:Bairro = Upper(XmlNode(mXmlNode2, "xBairro"))
      oNfe:Destinatario:CidadeIbge = XmlNode(mXmlNode2, "cMun")
      oNfe:Destinatario:Cidade = Upper(XmlNode(mXmlNode2, "xMun"))
      oNfe:Destinatario:Uf = Upper(XmlNode(mXmlNode2, "UF"))
      oNfe:Destinatario:Cep = Transform(XmlNode(mXmlNode2, "CEP"), "@R 99999-999")
      oNfe:Destinatario:Telefone = XmlNode(mXmlNode2, "fone")

mXmlNode1 = XmlNode(XmlInput, "transp")
   mXmlNode2 = XmlNode(mXmlNode1, "transporta")
      oNfe:Transporte:Cnpj = Transform(XmlNode(mXmlNode2, "CNPJ"), "@R 99.999.999/9999-99")
      oNfe:Transporte:Nome = Upper(XmlNode(mXmlNode2, "xNome"))
      oNfe:Transporte:InscricaoEstadual = XmlNode(mXmlNode2, "IE")
      oNfe:Transporte:Endereco = Upper(XmlNode(mXmlNode2, "xEnder"))
      oNfe:Transporte:Cidade = Upper(XmlNode(mXmlNode2, "xMun"))
      oNfe:Transporte:Uf = Upper(XmlNode(mXmlNode2, "UF"))
      oNfe:Transporte:Volumes:Qtde = Val(XmlNode(mXmlNode2, "qVol"))
      oNfe:Transporte:Volumes:Especie = Upper(XmlNode(mXmlNode2, "esp"))
      oNfe:Transporte:Volumes:Marca = Upper(XmlNode(mXmlNode2, "marca"))
      oNfe:Transporte:Volumes:PesoLiquido = Val(XmlNode(mXmlNode2, "pesoL"))
      oNfe:Transporte:Volumes:PesoBruto = Val(XmlNode(mXmlNode2, "pesoB"))
   mXmlNode2 = XmlNode(mXmlNode1, "veicTransp")
   oNfe:Transporte:PlacaUf = Upper(XmlNode(mXmlNode2, "UF"))
   oNfe:Transporte:Placa = Upper(XmlNode(mXmlNode2, "placa"))
   
mXmlNode1 = XmlNode(XmlInput, "total")
   oNfe:Totais:IpiVal = Val(XmlNode(mXmlNode1,"vIPI"))
   oNfe:Totais:IIVal  = Val(XmlNode(mXmlNode1,"vII"))
   oNfe:Totais:IcmBas = Val(XmlNode(mXmlNode1, "vBC"))
   oNfe:Totais:IcmVal = Val(XmlNode(mXmlNode1, "vICMS"))
   oNfe:Totais:SubBas = Val(XmlNode(mXmlNode1, "vBCST"))
   oNfe:Totais:SubVal = Val(XmlNode(mXmlNode1, "vST"))
   oNfe:Totais:PisVal = Val(XmlNode(mXmlNode1,"vPIS"))
   oNfe:Totais:CofVal = Val(XmlNode(mXmlNode1,"vCOFINS"))
   oNfe:Totais:ValPro = Val(XmlNode(mXmlNode1, "vProd"))
   oNfe:Totais:ValSeg = Val(XmlNode(mXmlNode1, "vSeg"))
   oNfe:Totais:ValFre = Val(XmlNode(mXmlNode1, "vFrete"))
   oNfe:Totais:ValOut = Val(XmlNode(mXmlNode1, "vOutro"))
   oNfe:Totais:ValNot = Val(XmlNode(mXmlNode1, "vNF"))
*----------------------------------------------------------------


// Gerar Xml
mXml := "<icms>"
mXml += XmlTag("BaseCalculo",Ltrim(Str(banco->Base,15,2)))
mXml += XmlTag("Aliquota",Ltrim(Str(banco->Aliquota,15,2)))
mXml += XmlTag("Valor",Ltrim(Str(banco->VlIcms,15,2)))
mXml += "</icms>"

// Ou...
mXml := XmlTag(  ;
   "icms", ;
       XmlTag("BaseCalculo",Ltrim(Str(banco->Base,15,2))) + ;
       XmlTag("Aliquota",Ltrim(Str(banco->Aliquota,15,2))) + ;
       XmlTag("Valor",Ltrim(Str(banco->VlIcms,15,2))) ;
   )

*----------------------------------------------------------------
// lComTag é pra pegar com ou sem as tags iniciais/finais do Node/Bloco

Function XmlNode(cXml, cNode, lComTag)
Local mInicio := 0, mFim := 0, cResultado := ""

lComTag := iif(lComTag==NIL,.f.,lComTag)
If " " $ cNode
   cNode := Substr(cNode,1,At(" ",cNode)-1)
Endif   
   
mInicio := At("<"+cNode,cXml)
If mInicio != 0
   If .Not. lComTag
      mInicio := mInicio + Len(cNode) + 2
      If mInicio != 1 .And. Substr(cXml,mInicio-1,1) != ">" // Quando tem elementos no bloco
         mInicio := AtStart(">",cXml,mInicio)+1
      Endif
   Endif
Endif   

If mInicio != 0 
   mFim = AtStart( "</" + cNode + ">",cXml,mInicio)
   If mFim != 0
      mFim -=1
      If lComTag
         mFim := mFim + Len(cNode) + 3
      Endif
   Endif
   If mFim <> 0 
      cResultado = Substr(cXml, mInicio, mFim - mInicio + 1)
   EndIf
EndIf
Return cResultado
*----------------------------------------------------------------


Function XmlElement(cXml, cElement )

Local mInicio := 0, mFim := 0, cResultado := ""

mInicio = At(cElement + "=",cXml) + 1
mInicio = AtStart("=",cXml,mInicio)+2
mFim = AtStart(["], cXml, mInicio) - 1
If mInicio >0 .And. mFim > 0 .And. mFim > mInicio 
   cResultado = Substr(cXml, mInicio, mFim - mInicio + 1)
EndIf
Return cResultado
*----------------------------------------------------------------


Function AtStart( cSearch, cString, nStart, nEnd )
Local nPosicao := 0
nStart := iif(nStart==NIL,1,nStart)
nEnd := iif(nEnd==NIL,Len(cString),nEnd)

nPosicao := At(cSearch,Substr(cString,nStart,nEnd))
If nPosicao != 0
   nPosicao := nPosicao + nStart -1
Endif
Return nPosicao   
*----------------------------------------------------------------


Function XmlTag(cTag, cConteudo)

Local cTexto := ""
cConteudo := Iif(cConteudo == NIL, "", cConteudo)
cConteudo := AllTrim(cConteudo)

If Len(Trim(cConteudo)) = 0
   cTexto := [<]+ cTag + [/>]
Else   
   cConteudo := AllTrim(cConteudo)
   If Len(cConteudo) == 0
      cConteudo := " "
   Endif      
   cTexto := cTexto + [<] + cTag + [>] + cConteudo + [</] + cTag + [>]
Endif
Return cTexto
*----------------------------------------------------------------


Function XmlDate(cData)

Local mDate
mDate := Ctod(Substr(cData,9,2) + "/" + Substr(cData,6,2) + "/" + Substr(cData,1,4))
Return mDate
*----------------------------------------------------------------

José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Rotinas pra XML

Mensagem por sygecom »

Olá José,
Muito bom seus exemplos, parabéns.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder