NFE XML

ETTORE 08/11/2011 16:47:21
#388744
Pessoal, boa tarde!

Estou com um problema ao criar uma rotina para leitura e importação dos XML das NFe. Resolvi muita coisa já e estou com a rotina quase pronta.
A idéia foi varrer o XML e atribuir campo a campo a um dataset para depois manipulá-lo dentro do software.

Pois bem, o problema agora esta sendo a leitura do XML da NFe. Acredito que esta cabeçalho esta gerando algum problema, pois quando eu tiro ele fora, funciona normalmente a rotina:
[txt-color=#0000f0]
<?xml version=[Ô]1.0[Ô] encoding=[Ô]UTF-8[Ô] ?>
- <nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] xmlns:ds=[Ô]http://www.w3.org/2000/09/xmldsig#[Ô] xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xsi:schemaLocation=[Ô]http://www.portalfiscal.inf.br/nfe procNFe_v1.10.xsd[Ô] versao=[Ô]1.10[Ô]>
- <NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>
- <infNFe Id=[Ô]NFe35110162367032000187550010000035270078455570[Ô] versao=[Ô]1.10[Ô]>
[/txt-color]
Segue o esqueleto do código:

Dim produtos As XmlDocument = New XmlDocument
Dim nos As XmlNodeList

produtos.Load([Ô]C:
fe.xml[Ô])

nos = produtos.DocumentElement.FirstChild.SelectNodes([Ô]//det[Ô])

For Each A As XmlNode In nos

Next

Caso eu exclua as tags mencionadas acima, a rotina roda normal. Contudo, se eu deixar, o loop será desprezado, ou seja, a variável [Ô]nos[Ô] não esta recebendo a tag <det> como deveria ser.

Por favor, se algum puder ajudar!
Assim que terminar, vou postar a rotina completa para o pessoal.
Valeu moçada!

KERPLUNK 08/11/2011 17:10:28
#388745
Tenta assim:

nos = produtos.DocumentElement.FirstChild.SelectNodes([Ô]//nfeProc//det[Ô])
ETTORE 08/11/2011 17:24:05
#388747
Puxa,

Tentei, mas foi sem sucesso..rs!

Estou tentando também, vamos ver se eu consigo.

Grato pela tentativa.

JUNIORJ10 08/11/2011 18:26:33
#388751
amigo tenta isso
Function FncProcessarXml(xml As String, TituloArquivo As String, Ixml As Integer, TTXml As Integer) As Boolean
[ô]Precedimentos:
[ô]1 Procurar Nota No sistema
[ô]2 Inserir Nota caso não haja no sistema
[ô]3 Inserir Produtos NO ssitema
[ô]4 Inserir Vencimentos no sistema
[ô]5 Agendar Pagamento dos Boletos no Fluxo


[ô]Lendo o Xml
[ô]Declarações Gerais
Dim oxmlElement As IXMLDOMElement

Dim Emit As String, Dest As String [ô]Cnpj Emissor e Destinatario
Dim QuantPrdNfs As Integer
Dim CodNfs As Long [ô]Numero da Nota
Dim DataEmitNfs As Date [ô]Data de Emissão
Dim TotalNfs As Currency [ô]Total Nota
[ô]--------------------------------------------------------
Dim TtNodeNfs As Integer
Dim nodeindex As Integer
Dim FornXml As String [ô]Nome do Emissor
Dim DestXml As String [ô]Nome do Destinatario

QuantVenc = [Ô]0[Ô]
QuantPrd = [Ô]0[Ô]

[ô]Informando Procedimento com Arquivos Xml
Select Case DLookup([Ô]Procedimentos[Ô], [Ô]Config_Sist[Ô])
Case [Ô]Mover/Processados[Ô]
destino = DLookup([Ô]LocalxmlVerificar[Ô], [Ô]Config_sist[Ô])
Case [Ô]Mover/Retaguarda[Ô]
destino = DLookup([Ô]LocalxmlSistemaRetaguarda[Ô], [Ô]Config_sist[Ô])
End Select

DestinoNp = DLookup([Ô]LocalXmlNProcessados[Ô], [Ô]Config_sist[Ô])

TempInicioArq = Time

[ô]On Error GoTo Trata_Erro

[ô]Inicializando Processo de Leitura
Set xmldoc = New DOMDocument30
xmldoc.async = False
xmldoc.validateOnParse = False
xmldoc.preserveWhiteSpace = False

xmldoc.Load (xml)

[ô]Somando nos Xml
TtNodeNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes.Length - 1

[ô]Dados Principais
For nodeindex = 0 To TtNodeNfs
[ô]Selecionado nos Secundarios
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]ide[Ô]
Dim DataEmitP As String
[ô]Codigo da Nota
CodNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(6).Text [ô]Codigo da Nota
[ô]----------------
[ô]Data da Nota
DataEmitNfs = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(7).Text
[ô]----------------------
Case [Ô]emit[Ô]
[ô]Emissor
Emit = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).FirstChild.Text
FornXml = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(1).Text
Case [Ô]dest[Ô]
[ô]Destinatario
Dest = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(0).Text
DestXml = xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).ChildNodes(1).Text
Case [Ô]total[Ô]
[ô]TotalNfs
TotalNfs = CCur(Replace(xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).FirstChild.ChildNodes(13).Text, [Ô].[Ô], [Ô],[Ô]) * -1)
End Select
Next

[ô]------------------------------------------------------------------

[ô]Inicializando Verificação
[ô]--------------------------------------------------------------------------------------
[ô]Inicializando Processos Finais de Inserção
[ô]Exigindo Inspeção
Dim Favorecido As Integer
Dim Filial As Integer
Filial = CInt(Nz(DLookup([Ô][Cod][Ô], [Ô]Cad_Filiais[Ô], [Ô][CNPJ]=[ô][Ô] & Dest & [Ô][ô][Ô]), 0))
Dim ImportXml_Filial As Boolean
Dim GeraContasPagarXml As Boolean
Dim GerarContasPgarFluxo As Boolean
Dim Id As Long
Id = 0
[ô]-----------------

ImportXml_Filial = Nz(DLookup([Ô]ImportarXmlNota[Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
GeraContasPagarXml = Nz(DLookup([Ô]ContasPAgarXml[Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
GerarContasPgarFluxo = Nz(DLookup([Ô][gera contasFluxo][Ô], [Ô]Config_Drogarias[Ô], [Ô][Filial]=[Ô] & Filial), False)
[ô]-----------------
[ô]Verificvando se importa o arquivo Xml
Select Case ImportXml_Filial
Case True
Select Case fncinspectnfs(Dest, Emit, DataEmitNfs, CodNfs)
Case True
Id = fncinsertnfs(Dest, Emit, DataEmitNfs, CodNfs, TotalNfs, QuantPrdNfs, TituloArquivo, xml)

[ô]Ececultar Somente se id For Diferente de 0
Select Case Id

Case Is <> [Ô]0[Ô]
[ô]Inserindo Produtos
[ô]Reinicializando

[ô]Inserindo Produto
For nodeindex = 0 To TtNodeNfs
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]det[Ô]
Call fncinsertprodnfs(Id, nodeindex, xml)
End Select
Next
[ô]Atualizando soma de Produtos
CurrentDb.Execute [Ô]UPDATE NotasFiscais SET QuantPrd = [ô][Ô] & QuantPrd & [Ô][ô] WHERE Codigo = [Ô] & Id & [Ô];[Ô]

End Select
Favorecido = DLookup([Ô][Id][Ô], [Ô]Cad_Favorecidos[Ô], [Ô][CNPJ/CPF]=[ô][Ô] & Emit & [Ô][ô][Ô])
[ô]Verificar se insere os Vencimentos
For nodeindex = 0 To TtNodeNfs
Select Case xmldoc.DocumentElement.FirstChild.FirstChild.ChildNodes(nodeindex).nodeName
Case [Ô]cobr[Ô]
Call fncinsertVencnfs(Id, nodeindex, xml, GerarContasPgarFluxo, GeraContasPagarXml, DataEmitNfs, Filial, Favorecido, CodNfs)
End Select
Next
CurrentDb.Execute [Ô]UPDATE NotasFiscais SET QuantVenc = [ô][Ô] & QuantVenc & [Ô][ô] WHERE Codigo = [Ô] & Id & [Ô];[Ô]




Case False
Call MoverXml(xml, DestinoNp, True)
[ô]Call ProcdErro(FornXml, TituloArquivo, Emit)
Call NProcess(TituloArquivo, Emit, FornXml, Dest, DestXml, DataEmitNfs, ArqNProcess(MotvNProcess))
End Select

Case False
Call MoverXml(xml, DestinoNp, True)
Call NProcess(TituloArquivo, Emit, FornXml, Dest, DestXml, DataEmitNfs, ArqNProcess([Ô]1[Ô]))
End Select

FncProcessarXml = True
TempFimLeitArqbarra = Time
Exit Function



Trata_Erro:
Call MoverXml(xml, [Ô]F:\Controle farmaceres\Xml\Erro\[Ô], True)
FncProcessarXml = True
TempFimLeitArqbarra = Time
Exit Function

End Function

Qualquer duvida é so perguntar, criei este codigo e utilizo ele sem problemas a um tenpão se precisar tenho algumas outras opções de verificações de xml, entre outras....
ETTORE 08/11/2011 18:40:54
#388753
Cara, muito obrigado!

Vou ler com calma sua rotina, parece realmente muito completa.

Contudo, estou com a minha praticamente finalizada, aguardando apenas resolver esse problema.

Além disso, estou realmente curioso para entender o porque da XmlDocument não lê a tag <NFe xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô]>

Vou deixar sua ajuda na manga, afinal, se não for por bem, vai por banco...rs

Abraço,
Valeu!
JUNIORJ10 09/11/2011 16:32:27
#388831
Cara tenho quase certeza que o seu probela esta neste caractere: - <nfeProc xmlns=[Ô]http://www.portalfiscal.inf.br/nfe[Ô] xmlns:ds=[Ô]http://www.w3.org/2000/09/xmldsig#[Ô] xmlns:xsi=[Ô]http://www.w3.org/2001/XMLSchema-instance[Ô] xsi:schemaLocation=[Ô]http://www.portalfiscal.inf.br/nfe procNFe_v1.10.xsd[Ô] versao=[Ô]1.10[Ô]>

ta vendo o caracete # este se não me engando da erro na leitura do arquivo. Em notas fiscais eletronicas somos acostumados a evitar estes tipos de caracteres especiais. tenta arrancar ele e ve se le?
ETTORE 10/11/2011 09:03:31
#388874
Olá pessoal,

Pois bem, infelizmente não funcionou a dica do JuniorRJ10 tendo em vista que testei em vários XML de NFe distintos.

Não usei o loadxml, contudo, até onde eu sei, essa rotina é utlizada quando a string passada para o loadxml forem as próprias tags do XML, isto é, o XML em si.

Acho que o caminho é desvendar melhor o funcionamento do XMLdocument, posto que utilizando o DOMdocument, a leitura funciona normamente.

Valeu por enquanto pessoal!

Vamos a luta!

Abraço
PEGUDO 10/11/2011 14:50:37
#388897
Pelo que vi, os nós que dão erro estão no começo do XML.

Se você não precisa exibir estas linhas, tenta fazer o loop começar depois destas linhas.

exemplo:
For A = 5 To nos.count - 1

Next

Bom, a idéia é essa.
eu to sem o VB aqui pra testar, mas a idéia é fazer o programa começar o loop depois destas linhas
(se você não precisar delas é claro)
PDIAS 13/12/2011 13:44:20
#391242
ETTORE, fiz uma dll que le todo xml
Tópico encerrado , respostas não são mais permitidas