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
*----------------------------------------------------------------
