none
NFE - Ler os itens da NFe RRS feed

  • Pergunta

  • Bom dia Fórum!

    Dúvidas e mais dúvidas sobre a NFe. Neste caso, estou atolado nos itens de uma NFe. Não estou conseguindo ler os mesmos. Nem com xPath e nem com SelectNodes.

    Minha idéia: Usar o SelectNodes de um documento XML, para acessar todos os itens da NFe, e depois utilizar o For Each para percorrer. Seria uma ótima solução para mim, se não fosse o detalhe de eu não estar consguindo ler os itens.

    A estrutura básica dos XMLs que estão vindo para mim é essa:

    <?xml version="1.0" encoding="UTF-8" ?>
    - <nfeProc versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe">
    - <NFe xmlns="http://www.portalfiscal.inf.br/nfe">
    - <infNFe versao="1.10" Id="Chave">
    - <ide>
              Conteúdo de IDE (leio normalmente com xPath)
    - </ide>
    - <emit>
              Conteúdo de emit (leio normalmente com xPath)
    - </emit>
    - <dest>
       Conteúdo de dest (leio normalmente com xPath)
    - </dest>
    - <det nItem="1">   'Meu problema está aqui.)
        - <prod>
        - </prod>
        - <imposto>
        - </imposto>
    - </det>
    - <det nItem="2">
        .
        .
        .
        .
        .

    dd 

    Como que eu faço para acessa o nó <det nItem="1"><prod> por xpath? Quando tento desta forma:

    node = xpathNav.SelectSingleNode(

     

    "//nfe:infNFe/nfe:det nItem=1/nfe:Prod/nfe:cProd", ns)

    Dá erro de Token inválido. Se tento por esse caminho (ainda em xPath):

    node = xpathNav.SelectSingleNode(

     

    "//nfe:infNFe/nfe:det/nfe:Prod/nfe:cProd", ns)

    Não da erro, mas também não retorna nada.

    E como seria se eu utilizar o SelecNodes?

    Minha dúvida ainda é referente ao meu outro post (http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/6536af63-4485-4338-9b4c-6752943cde5d) onde obtive a estrutura da NFe do Manual de integração.

    Qualquer ajuda ou dica de como resolver esse passo me ajudará muito!

    Obrigado

    Giovani

    • Movido Eder Costa sexta-feira, 18 de fevereiro de 2011 14:26 Tratamento XML (De:VB.NET e Visual Basic)
    quarta-feira, 16 de fevereiro de 2011 12:41

Respostas

  • Bom dia!

    Após muita pesquisa (e tentativas infrutíferas de solucionar minha dúvida!) encontrei uma direção em qual seguir. O usuário Barros do Fórum VBMania, respondeu minha minha pergunta lá com a seguinte sub (página 86 do post http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=337965&varPagina=86):

    Public Sub subLerXML(ByRef docXML As XmlDocument)
            Dim strRetorno As String = "", _
                noPai As XmlElement, _
                noFilho As XmlElement, _
                noNeto As XmlElement, _
                noBisneto As XmlElement, _
                noTetra As XmlElement, _
                nodelist As XmlNodeList = docXML.DocumentElement.ChildNodes

            If Len(docXML.OuterXml) > 0 Then
                
                For Each noPai In nodelist 'Le os nós principais da NFe
                    If noPai.Name = "NFe" Then
                        For Each noFilho In noPai 'Lê os Nós secundários
                            If noFilho.Name = "infNFe" Then 'Se for o cabecalho da NFe
                                For Each noNeto In noFilho 'Lê as Tags da NFe
                                    If noNeto.Name = "ide" Then 'Verifica a identificação da NFe
                                        Me.ListBox1.Items.Add("Identificação da NFe")
                                        Me.ListBox1.Items.Add("____________________")
                                        For Each noBisneto In noNeto 'Verifica os valores da NFe
                                            ListBox1.Items.Add(noBisneto.InnerText)
                                            strRetorno &= noBisneto.InnerText & "|"
                                        Next
                                    ElseIf noNeto.Name = "emit" Then 'Dados do Emitente da NFe
                                        Me.ListBox1.Items.Add("Dados do Emitente")
                                        Me.ListBox1.Items.Add("____________________")
                                        For Each noBisneto In noNeto
                                            If noBisneto.Name = "enderEmit" Then 'Dados do Endereço do emitente
                                                For Each noTetra In noBisneto
                                                    ListBox1.Items.Add(noTetra.InnerText)
                                                    strRetorno &= noTetra.InnerText & "|"
                                                Next
                                            Else
                                                ListBox1.Items.Add(noBisneto.InnerText)
                                                strRetorno &= noBisneto.InnerText & "|"
                                            End If
                                        Next
                                    ElseIf noNeto.Name = "dest" Then 'Dados do Destinatário
                                        Me.ListBox1.Items.Add("Dados do Destinatário")
                                        Me.ListBox1.Items.Add("____________________")
                                        For Each noBisneto In noNeto
                                            If noBisneto.Name = "enderDest" Then 'Dados do Endereço do emitente
                                                For Each noTetra In noBisneto
                                                    ListBox1.Items.Add(noTetra.InnerText)
                                                    strRetorno &= noTetra.InnerText & "|"
                                                Next
                                            Else
                                                ListBox1.Items.Add(noBisneto.InnerText)
                                                strRetorno &= noBisneto.InnerText & "|"
                                            End If
                                        Next
                                    End If
                                Next
                            End If
                        Next
                    End If
                Next
            End If
            Me.ListBox1.Items.Add("________________________________________________")
            Me.ListBox1.Items.Add(strRetorno)

    end sub

    Eu parcialmente adaptei essa sub a minha realidade e consegui finalmente acessar as informações de itens de uma NFe. É claro que ainda terei muito trabalho para deixar do jeito que quero, mas já é um bom começo.

    Até mais!

    • Marcado como Resposta Giovani Rodrigues terça-feira, 22 de fevereiro de 2011 11:22
    • Editado Giovani Rodrigues terça-feira, 22 de fevereiro de 2011 11:23 palavra errada
    terça-feira, 22 de fevereiro de 2011 11:21
  • Boa tarde a todos. Eu gostaria de compartilhar uma segunda solução que descobri agora pouco.

    Essa solução é bem mais fácil do que a que postei anteriormente. Para acessar o item N de uma nota fiscal eletrônica por XmlNamespaceManager , eu precisei apenas fazer isso:

    Dim node As XPathNavigator

    node = xpathNav.SelectSingleNode("//nfe:infNFe/nfe:det[2]/nfe:prod/nfe:xProd", ns)

    No caso acima, estou pegando a descrição do segundo item da nfe!

    Engraçado que quando desisti de encontrar um jeito mais fácil, eu esbarrei na solução! :)

    Até a próxima dúvida/drama!
    PS: Solução encontrada com ajuda deste site: http://www.w3schools.com/XPath/xpath_syntax.asp

    segunda-feira, 14 de março de 2011 16:08

Todas as Respostas

  • Olá Giovani!

    Sua thread será respondida em seu respectivo fórum.

    att;


    Eder Costa - LATAM Forum Support Engineer
    Microsoft Corporation
    sexta-feira, 18 de fevereiro de 2011 14:25
  • Bom dia!

    Após muita pesquisa (e tentativas infrutíferas de solucionar minha dúvida!) encontrei uma direção em qual seguir. O usuário Barros do Fórum VBMania, respondeu minha minha pergunta lá com a seguinte sub (página 86 do post http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=337965&varPagina=86):

    Public Sub subLerXML(ByRef docXML As XmlDocument)
            Dim strRetorno As String = "", _
                noPai As XmlElement, _
                noFilho As XmlElement, _
                noNeto As XmlElement, _
                noBisneto As XmlElement, _
                noTetra As XmlElement, _
                nodelist As XmlNodeList = docXML.DocumentElement.ChildNodes

            If Len(docXML.OuterXml) > 0 Then
                
                For Each noPai In nodelist 'Le os nós principais da NFe
                    If noPai.Name = "NFe" Then
                        For Each noFilho In noPai 'Lê os Nós secundários
                            If noFilho.Name = "infNFe" Then 'Se for o cabecalho da NFe
                                For Each noNeto In noFilho 'Lê as Tags da NFe
                                    If noNeto.Name = "ide" Then 'Verifica a identificação da NFe
                                        Me.ListBox1.Items.Add("Identificação da NFe")
                                        Me.ListBox1.Items.Add("____________________")
                                        For Each noBisneto In noNeto 'Verifica os valores da NFe
                                            ListBox1.Items.Add(noBisneto.InnerText)
                                            strRetorno &= noBisneto.InnerText & "|"
                                        Next
                                    ElseIf noNeto.Name = "emit" Then 'Dados do Emitente da NFe
                                        Me.ListBox1.Items.Add("Dados do Emitente")
                                        Me.ListBox1.Items.Add("____________________")
                                        For Each noBisneto In noNeto
                                            If noBisneto.Name = "enderEmit" Then 'Dados do Endereço do emitente
                                                For Each noTetra In noBisneto
                                                    ListBox1.Items.Add(noTetra.InnerText)
                                                    strRetorno &= noTetra.InnerText & "|"
                                                Next
                                            Else
                                                ListBox1.Items.Add(noBisneto.InnerText)
                                                strRetorno &= noBisneto.InnerText & "|"
                                            End If
                                        Next
                                    ElseIf noNeto.Name = "dest" Then 'Dados do Destinatário
                                        Me.ListBox1.Items.Add("Dados do Destinatário")
                                        Me.ListBox1.Items.Add("____________________")
                                        For Each noBisneto In noNeto
                                            If noBisneto.Name = "enderDest" Then 'Dados do Endereço do emitente
                                                For Each noTetra In noBisneto
                                                    ListBox1.Items.Add(noTetra.InnerText)
                                                    strRetorno &= noTetra.InnerText & "|"
                                                Next
                                            Else
                                                ListBox1.Items.Add(noBisneto.InnerText)
                                                strRetorno &= noBisneto.InnerText & "|"
                                            End If
                                        Next
                                    End If
                                Next
                            End If
                        Next
                    End If
                Next
            End If
            Me.ListBox1.Items.Add("________________________________________________")
            Me.ListBox1.Items.Add(strRetorno)

    end sub

    Eu parcialmente adaptei essa sub a minha realidade e consegui finalmente acessar as informações de itens de uma NFe. É claro que ainda terei muito trabalho para deixar do jeito que quero, mas já é um bom começo.

    Até mais!

    • Marcado como Resposta Giovani Rodrigues terça-feira, 22 de fevereiro de 2011 11:22
    • Editado Giovani Rodrigues terça-feira, 22 de fevereiro de 2011 11:23 palavra errada
    terça-feira, 22 de fevereiro de 2011 11:21
  • Boa tarde a todos. Eu gostaria de compartilhar uma segunda solução que descobri agora pouco.

    Essa solução é bem mais fácil do que a que postei anteriormente. Para acessar o item N de uma nota fiscal eletrônica por XmlNamespaceManager , eu precisei apenas fazer isso:

    Dim node As XPathNavigator

    node = xpathNav.SelectSingleNode("//nfe:infNFe/nfe:det[2]/nfe:prod/nfe:xProd", ns)

    No caso acima, estou pegando a descrição do segundo item da nfe!

    Engraçado que quando desisti de encontrar um jeito mais fácil, eu esbarrei na solução! :)

    Até a próxima dúvida/drama!
    PS: Solução encontrada com ajuda deste site: http://www.w3schools.com/XPath/xpath_syntax.asp

    segunda-feira, 14 de março de 2011 16:08
  • Giovani você conseguiu ler os itens do XML dessa forma? Obrigada!
    terça-feira, 30 de outubro de 2012 12:58