Página 1 de 1

Rotinas pra XML

Enviado: 28 Jun 2012 11:34
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
*----------------------------------------------------------------


Rotinas pra XML

Enviado: 29 Jun 2012 11:47
por sygecom
Olá José,
Muito bom seus exemplos, parabéns.