Usuário com melhor resposta
VB.net e XML

Pergunta
-
Então galera estou chegando ao ponto de desistir. A cada solução pinta um problema novo e concluí que não tenho muito tino para lidar com edição leitura e edição XML.
O Que acontece é o seguinte... No dia a dia, recebo a nota fiscal digital e após importar temos muito trabalho alterando no nosso sistema, campos que já estão na NF digital.
Por exemplo;
Trabalhamos com valores de venda contidos no campo <vPmc>, no entanto o sistema lê o campo <vUnTrib>;
O modelo de vendas (CFOP) é 5405 e a nota vêm com 5403.
Entao fiz um programa em VB que em suma, altera esses valores e a nota ao ser importada, não requer que o funcionário precise repassar um por um das centenas de itens para corrigi-los manualmente.
Eu escrevi o seguinte código e esse se provou muito eficiente:
Private Sub executa() Dim doc As New XmlDocument() doc.Load(txtLocal.Text) ' Cria arrays contendo cada um os valores referentes ao TAG ... Dim NmProdList As XmlNodeList = doc.GetElementsByTagName("xProd") ' Só para ser usado como contador ... Dim CFOPList As XmlNodeList = doc.GetElementsByTagName("CFOP") Dim vPMCList As XmlNodeList = doc.GetElementsByTagName("vPMC") Dim vUnTrib As XmlNodeList = doc.GetElementsByTagName("vUnTrib") Dim i As Integer For i = 0 To NmProdList.Count - 1 ' Altera CFOP para 5405 caso 5403 ... If CFOPList(i).InnerText = "5403" Then CFOPList(i).InnerText = "5405" End If ' Importa PMC para Untrib ... vUnTrib(i).InnerText = vPMCList(i).InnerText Next i End Sub
Para ler Xml nestes formatos:
<det nItem="18"> <prod> <cEAN>7898414851577</cEAN> <xProd>SEDAVAN XPE INF 100ML LP:N</xProd> <CFOP>5403</CFOP> <uTrib>UN</uTrib> <vUnTrib>16.2300000000</vUnTrib> <xPed>17995768</xPed> <med> <vPMC>21.60</vPMC> </med> </prod> <imposto> <etc>123</etc> </imposto> </det>
Até que descobri que algumas notas vêem sem o campo <med> e consequentemente sem o <vPmc>, o que até não seria problema, pois se o codigo fosse capaz de identificar isso era só não alterar o valor de <vUnTrib>, só que isso acaba dando um baita problema dado que meu código trabalha com listas criadas por For / Next e se um item falta ele copia o do subsequente e "descalibra" a ordem e bagunça tudo ...
Então a minha nova ideia é que fosse lido da seguinte forma (que acho que seria a correta), tem um tag lá em cima de cada produto assim: <det nItem="xxx"> onde XX é numero do item na NF, então seria possível ler por exemplo aquela tag, trabalhar nos campos dela passar para a próxima?Estou perguntando por que não sei ao certo que código usar e mesmo que use fico com a impressão que vou dar outra brecha para erro.
ou se vcs tiverem uma forma mais segura para fazer isso funcionar por favor... Estou á uma semana nesse código e cada salto um tombo novo...
Desde já obrigado!
Respostas
-
Robson, ao invés de dar um GetElementsByTagName em cada elemento cEAN, xProd, etc. usando o objeto doc, capture os elementos det e encontre os elementos filhos a partir de cada det.
Ex:
Dim doc As New XmlDocument() doc.Load(txtLocal.Text) Dim elemList As XmlNodeList = doc.GetElementsByTagName("det") Dim ienum as IEnumerator = elemList.GetEnumerator() while (ienum.MoveNext()) Dim det as XmlNode det = CType(ienum.Current, XmlNode) Dim prod as XmlNode = det.SelectSingleNode("prod") Dim med as XmlNode = prod.SelectSingleNode("med") If med <> null Then ' busca o vPMC End If end while
Juliano Nunes - http://linkedin.com/in/julianonunes
Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.
Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.
- Sugerido como Resposta Roberto AB Filho quarta-feira, 22 de novembro de 2017 18:33
- Marcado como Resposta Filipe B CastroModerator quarta-feira, 22 de novembro de 2017 18:39
Todas as Respostas
-
Robson, ao invés de dar um GetElementsByTagName em cada elemento cEAN, xProd, etc. usando o objeto doc, capture os elementos det e encontre os elementos filhos a partir de cada det.
Ex:
Dim doc As New XmlDocument() doc.Load(txtLocal.Text) Dim elemList As XmlNodeList = doc.GetElementsByTagName("det") Dim ienum as IEnumerator = elemList.GetEnumerator() while (ienum.MoveNext()) Dim det as XmlNode det = CType(ienum.Current, XmlNode) Dim prod as XmlNode = det.SelectSingleNode("prod") Dim med as XmlNode = prod.SelectSingleNode("med") If med <> null Then ' busca o vPMC End If end while
Juliano Nunes - http://linkedin.com/in/julianonunes
Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.
Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.
- Sugerido como Resposta Roberto AB Filho quarta-feira, 22 de novembro de 2017 18:33
- Marcado como Resposta Filipe B CastroModerator quarta-feira, 22 de novembro de 2017 18:39
-
Boa tarde,
Por falta de retorno essa thread está encerrada.
Se necessário, favor abrir uma nova thread.
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.