LER XML NFE
2 - Use a ferramenta XSD no prompt de comando para converter o XML em classes correspondentes.
3 - Use métodos para desserializar o XML em dados
é uma das dificuldades mais comuns entre programadores mais antigos, ver XML como texto simplesmente. XML é muito mais que simplesmente texto. Ele pode até mesmo representar um pequeno banco de dados. O método que você está usando, pode até parecer que funciona, SQN.
Um exemplo de como gerar as classes:
D: emp>xsd test.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file [ô]D: emp est.xsd[ô].
D: emp>xsd test.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file [ô]D: emp est.cs[ô].
Sei que você está usando VB6, mas essa é uma boa [Ô]desculpa[Ô] para começar a usar .NET, ao menos o módulo de leitura do XML.
[ô]*** Importa o arquivo xml
Dim xmlDoc As New XmlDocument
xmlDoc.Load(W_ARQUIVO.Text)
Dim strxml As String = xmlDoc.InnerXml.ToString
[ô]*** Remove tags e nomespace ***
strxml = Replace(strxml, [Ô]<?xml version=[Ô][Ô]1.0[Ô][Ô] encoding=[Ô][Ô]UTF-8[Ô][Ô]?>[Ô], [Ô][Ô])
strxml = Replace(strxml, [Ô]xmlns=[Ô][Ô]http://www.portalfiscal.inf.br/nfe[Ô][Ô][Ô], [Ô][Ô])
strxml = Replace(strxml, [Ô]xmlns=[Ô][Ô]http://www.w3.org/2000/09/xmldsig#[Ô][Ô][Ô], [Ô][Ô])
[ô]*** Importa XML tratada sem tags e nomespace
Dim xDoc As New XmlDocument()
xDoc.LoadXml(strxml)
Using scope As New TransactionScope()
Try
[ô]*** Percorre a Estrutura do XML para a extração dos Dados ***
xNodeDest = xDoc.SelectSingleNode([Ô]nfeProc[Ô])
For Each xnfeProc As XmlNode In xNodeDest.ChildNodes
Select Case xnfeProc.Name
Case [Ô]NFe[Ô]
For Each xNFe As XmlNode In xnfeProc.ChildNodes
Select Case xNFe.Name
Case [Ô]infNFe[Ô]
For Each xInfNFe As XmlNode In xNFe.ChildNodes
Select Case xInfNFe.Name
Case [Ô]ide[Ô]
Case [Ô]NFref[Ô]
Case [Ô]emit[Ô]
Case [Ô]avulsa[Ô]
Case [Ô]dest[Ô]
Case [Ô]retirada[Ô]
Case [Ô]entrega[Ô]
Case [Ô]total[Ô]
Case [Ô]transp[Ô]
End Select
Next
Case [Ô]Signature[Ô]
End Select
Next
Case [Ô]protNFe[Ô]
End Select
Next
scope.Complete()
MessageBox.Show([Ô]XML importado![Ô], [Ô]Aviso[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show([Ô]XML não importado![Ô] + vbCrLf + ex.Message, [Ô]Aviso[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End Using
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9426
Citação::
peguei essa rotina aqui
[ô]*** Importa o arquivo xml
Dim xmlDoc As New XmlDocument
xmlDoc.Load(W_ARQUIVO.Text)
Dim strxml As String = xmlDoc.InnerXml.ToString
[ô]*** Remove tags e nomespace ***
strxml = Replace(strxml, [Ô]<?xml version=[Ô][Ô]1.0[Ô][Ô] encoding=[Ô][Ô]UTF-8[Ô][Ô]?>[Ô], [Ô][Ô])
strxml = Replace(strxml, [Ô]xmlns=[Ô][Ô]http://www.portalfiscal.inf.br/nfe[Ô][Ô][Ô], [Ô][Ô])
strxml = Replace(strxml, [Ô]xmlns=[Ô][Ô]http://www.w3.org/2000/09/xmldsig#[Ô][Ô][Ô], [Ô][Ô])
[ô]*** Importa XML tratada sem tags e nomespace
Dim xDoc As New XmlDocument()
xDoc.LoadXml(strxml)
Using scope As New TransactionScope()
Try
[ô]*** Percorre a Estrutura do XML para a extração dos Dados ***
xNodeDest = xDoc.SelectSingleNode([Ô]nfeProc[Ô])
For Each xnfeProc As XmlNode In xNodeDest.ChildNodes
Select Case xnfeProc.Name
Case [Ô]NFe[Ô]
For Each xNFe As XmlNode In xnfeProc.ChildNodes
Select Case xNFe.Name
Case [Ô]infNFe[Ô]
For Each xInfNFe As XmlNode In xNFe.ChildNodes
Select Case xInfNFe.Name
Case [Ô]ide[Ô]
Case [Ô]NFref[Ô]
Case [Ô]emit[Ô]
Case [Ô]avulsa[Ô]
Case [Ô]dest[Ô]
Case [Ô]retirada[Ô]
Case [Ô]entrega[Ô]
Case [Ô]total[Ô]
Case [Ô]transp[Ô]
End Select
Next
Case [Ô]Signature[Ô]
End Select
Next
Case [Ô]protNFe[Ô]
End Select
Next
scope.Complete()
MessageBox.Show([Ô]XML importado![Ô], [Ô]Aviso[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show([Ô]XML não importado![Ô] + vbCrLf + ex.Message, [Ô]Aviso[Ô], MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End Using
Ai eu pego o mesmo XML e faço assim :
XmlDocument x = new XmlDocument();
x.Load(@[Ô]C:
fexml.xml[Ô]);
XmlSerializer serializer = new XmlSerializer(typeof(NFe));
using (StringReader reader = new StringReader(x.OuterXml))
{
NFe = (NFe)(serializer.Deserialize(reader));
}
E bingoooo, minha classe está populada com uma NFe.....
Citação::
e para fazer a importação para a base de dados, voces amarram com o código de barras ?, pois ai, mesmo que comprem o mesmo produto de distribuidores diferentes, daria certo, pois fornecedor é um e marca/fabricante é outro...seria esta lógica ?
Porem, nem sempre(ou quase nunca) os distribuidores geram seus xmls com a Tag cEan preenchida.
O distribuidor A utiliza o codigo 333 para o produto A, o distribuidor B utiliza o codigo 444 para o produto A, e por ai vai.
E repito, nem sempre a tag cEan vem preenchida, uma vez que ela é opcional.
Eu tive que criar um algorÃtimo que automatizasse o máximo possÃvel. Hoje é algo de 80% automático o processo de importação, mas volta e meia o usuário tem que intervir e informar o produto correto.
Para isso, tive que restruturar o banco de dados ao que diz respeito a produto.
Ai depois sempre que vc for importar uma nota daquele fornecedor o sistema verifica nessa tabela se vc ja comprou o produto dele, caso ja tenha comprado ele vincula automatico... eu tenho isso no meu!
Os itens novos na tela de importação fica em vermelho... no caso o usuario clica 2 vezes sobre o item e aparece a tela de pesquisa de produtos... ao escolher ele ja vincula o item com o do cadastro e fica verde e somente acrescenta o estoq e altera os preços, na proxima vez q for importado o mesmo item.... ele vai usar o codigo do produto do fonecedor