Hackbart 0 Denunciar post Postado Dezembro 12, 2013 Eai Galera, Estava tentando validar o XML com o Schema da NFe e deu esse error ae: http://img801.imageshack.us/img801/5136/vwth.png alguem pode me ajudar ?? Imports System.Collections.Generic Imports System.Text Imports System.Xml Imports System.Xml.Schema Imports System.IO Imports System.Windows.Forms Imports System.Security.Cryptography.Xml Imports System.Security.Cryptography.X509Certificates Public Class Form1 Private Resultado As Boolean = True Public oCertificado As New X509Certificate2 Public vStrXmlRetorno As String Public vArqERRRetorno As String Public vPastaXMLErro As String Public vPastaXMLEnvio As String Public vArqXMLRetorno As String Public vPastaXMLRetorno As String Public vXmlNfeDadosMsg As String Public vAmbiente As Integer Public vUF As Integer Private Sub ValidaNfe(ByVal NfeAler As String) Try 'Abrir agora o arquivo XML criado e inserir o Protocolo encontrado!! Dim arquivo2 As String = NfeAler Dim xDoc As New XmlDocument : xDoc.Load(arquivo2) Dim Tamanho As String Dim Nfe As String Nfe = arquivo2 Tamanho = Replace(Nfe, "C:\", "") Tamanho = Replace(Tamanho, "F:\SisWin\NFE\BACKUP\200905\", "") Tamanho = Replace(Tamanho, "F:\SisWin\NFE\BACKUP", "") Tamanho = Replace(Tamanho, "F:\SisWin\NFE\AENVIAR", "") Tamanho = Replace(Tamanho, "F:\SisWin\NFE\AENVIAR", "") Tamanho = Replace(Tamanho, "\", "") Tamanho = Replace(Tamanho, "\NF-E", "") Tamanho = Replace(Tamanho, "NF-E", "") Tamanho = Replace(Tamanho, "SisWin", "") Tamanho = Replace(Tamanho, "SisWin", "") 'Fazer uma cópia d arquivo XML para gerar a assinatura Dim CaminhoArquivo As String = "C:\NF-E\XML\" + Tamanho 'Salva o Arquivo xDoc.Save(CaminhoArquivo) 'Selecionar certificado SelecionarCertificado() 'Assinar o XML Dim OAd As New AssinaturaDigitalClass() Dim pDadosNfe As String Dim vStringNfe As String 'Dim msgResultado As String OAd.Assinar(CaminhoArquivo, "infNFe", oCertificado) If OAd.vResultado = 0 Then 'Assinado corretamente pDadosNfe = OAd.vXMLStringAssinado vStringNfe = pDadosNfe.Substring(pDadosNfe.IndexOf("<NFe"), pDadosNfe.Length - pDadosNfe.IndexOf("<NFe")) Else 'Ocorreu algum erro na assinatura MessageBox.Show(OAd.vResultadoString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error) End If 'Validar o XML Dim TxtXSD As String TxtXSD = "C:\Users\Carlos\Desktop\PL_006i\nfe_v2.00.xsd" If Not CaminhoArquivo = String.Empty And Not TxtXSD = String.Empty Then Resultado = True Dim settings As New XmlReaderSettings() AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationEventHandler 'Valida o arquivo XML com o seu Schema XSD lstValida.Items.Add("Validando o arquivo XML " & CaminhoArquivo & " com o arquivo de Schema : " & TxtXSD) Try settings.ValidationType = ValidationType.Schema settings.Schemas.Add("http://www.portalfiscal.inf.br/nfe", XmlReader.Create(TxtXSD)) Using XmlValidatingReader As XmlReader = XmlReader.Create(CaminhoArquivo, settings) While XmlValidatingReader.Read() End While End Using Catch ex As Exception lstValida.Items.Add(ex.Message) Exit Sub End Try lstValida.Items.Add("Status Validação -> " & IIf(Resultado = True, "Arquivo validado com SUCESSO", "Validação FALHOU")) Else MsgBox("Informe o arquivo XML e o arquivo XSD.") End If Catch ex As Exception 'se ocorrer uma exceção exibe a mensagem lstValida.Items.Add(ex.Message) End Try End Sub Function SelecionarCertificado() As Boolean Dim vRetorna As Boolean Dim oX509Cert As New X509Certificate2 Dim store As New X509Store Dim collection As New X509Certificate2Collection Dim collection1 As New X509Certificate2Collection Dim collection2 As New X509Certificate2Collection Dim scollection As New X509Certificate2Collection Dim msgResultado As String Dim xnome As String xnome = "CN=COPLAST INDUSTRIA E COMERCIO DE RESIDUOS PLASTICO:04672291000115, OU=Autenticado por AR Fenacon, OU=RFB e-CNPJ A1, OU=Secretaria da Receita Federal do Brasil - RFB, L=Manaus, S=AM, O=ICP-Brasil, C=BR" oX509Cert = New X509Certificate2() store = New X509Store("MY", StoreLocation.CurrentUser) store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly) collection = store.Certificates collection1 = collection.Find(X509FindType.FindByTimeValid, DateTime.Now, False) collection2 = collection.Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, False) 'Encontra o certificado digital pelo nome do mesmo, se precisar pergunta por isso 'Resolvido em 13/05/2009 às 15:05h scollection = collection.Find(X509FindType.FindBySubjectDistinguishedName, xnome, False) 'Para selecionar o certificado de uma lista 'scollection = X509Certificate2UI.SelectFromCollection(collection2, "Certificado(s) Digital(is) disponível(is)", "Selecione o certificado digital para uso no aplicativo", X509SelectionFlag.SingleSelection) If (scollection.Count = 0) Then msgResultado = "Nenhum certificado digital foi selecionado ou o certificado selecionado está com problemas." MessageBox.Show(msgResultado, "Advertência", MessageBoxButtons.OK, MessageBoxIcon.Warning) vRetorna = False Else oX509Cert = scollection.Item(0) 'Para selecionar o item em Vb.NET oCertificado = oX509Cert xnome = oCertificado.Subject.ToString vRetorna = True 'msgResultado = "Certificado Selecionado." 'MessageBox.Show(msgResultado, "Advertência", MessageBoxButtons.OK, MessageBoxIcon.Warning) Return vRetorna End If End Function Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs) Resultado = False 'lstValida.Items.Add(vbTab + "Erro de Validação : " + args.Message) If args.Severity = XmlSeverityType.Warning Then MsgBox("Nenhum arquivo de Schema foi encontrado para efetuar a validação...") ElseIf args.Severity = XmlSeverityType.Error Then lstValida.Items.Add(args.Message) 'MsgBox("Ocorreu um erro durante a validação....") End If If Not (args.Exception Is Nothing) Then ' Erro na validação do schema XSD 'lstValida.Items.Add(args.Exception.SourceUri + "," & args.Exception.LinePosition & "," & args.Exception.LineNumber) 'MsgBox(args.Exception.SourceUri + "," & args.Exception.LinePosition & "," & args.Exception.LineNumber) End If End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim Valor As String Me.Show() Valor = "C:\Users\Carlos\Documents\32131227494152000144550010000002051001110251-nfe.xml" ValidaNfe(Valor) If Command() <> "" Then Valor = Command() ValidaNfe(Valor) Me.Focus() Me.Show() Me.WindowState = FormWindowState.Normal End If End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Me.Show() End Sub End Class Public Class AssinaturaDigitalClass Public vResultado As Integer Public vResultadoString As String Public vXMLStringAssinado As String Public XmlDoc As XmlDocument Sub Assinar(ByVal pArqXMLAssinar As String, ByVal pUri As String, ByVal pCertificado As X509Certificate2) 'Abrir o arquivo XML a ser assinado e ler o seu conteúdo Dim SR As StreamReader Dim vXMLString As String SR = File.OpenText(pArqXMLAssinar) vXMLString = SR.ReadToEnd() SR.Close() ' //Atualizar atributos de retorno com conteúdo padrão vResultado = 0 vResultadoString = "Assinatura realizada com sucesso" Try 'Verifica o certificado a ser utilizado na assinatura Dim _xnome As String Dim _X509Cert As X509Certificate2 Dim store As X509Store Dim collection As X509Certificate2Collection Dim collection1 As X509Certificate2Collection _xnome = "" _xnome = pCertificado.Subject.ToString() _X509Cert = New X509Certificate2() store = New X509Store("MY", StoreLocation.CurrentUser) store.Open(OpenFlags.ReadOnly Or OpenFlags.OpenExistingOnly) collection = store.Certificates collection1 = collection.Find(X509FindType.FindBySubjectDistinguishedName, _xnome, False) If (collection1.Count = 0) Then vResultado = 2 vResultadoString = "Problemas no certificado digital" Else ' certificado ok 'oX509Cert = scollection.Item(0) _X509Cert = collection1.Item(0) Dim x As String x = _X509Cert.GetKeyAlgorithm().ToString() ' Create a new XML document. Dim doc As New XmlDocument doc = New XmlDocument() 'Format the document to ignore white spaces. doc.PreserveWhitespace = False ' Load the passed XML file using it’s name. Try doc.LoadXml(vXMLString) ' Verifica se a tag a ser assinada existe é única Dim qtdeRefUri As Integer qtdeRefUri = doc.GetElementsByTagName(pUri).Count If (qtdeRefUri = 0) Then ' a URI indicada não existe vResultado = 4 vResultadoString = "A tag de assinatura " + pUri.Trim() + " não existe" Else ' Existe mais de uma tag a ser assinada If (qtdeRefUri > 1) Then ' existe mais de uma URI indicada vResultado = 5 vResultadoString = "A tag de assinatura " + pUri.Trim() + " não é unica" Else Try ' Create a SignedXml object. Dim signedXml As SignedXml signedXml = New SignedXml(doc) ' Add the key to the SignedXml document signedXml.SigningKey = _X509Cert.PrivateKey ' Create a reference to be signed Dim reference As New Reference reference = New Reference() '--------- RETIRAR COMENTÁRIOS DAS LINHAS ABAIXO ' pega o uri que deve ser assinada Dim _Uri As XmlAttributeCollection Dim _atributo As XmlAttribute _Uri = doc.GetElementsByTagName(pUri).Item(0).Attributes For Each _atributo In _Uri If (_atributo.Name = "Id") Then reference.Uri = "#" + _atributo.InnerText End If Next ' Add an enveloped transformation to the reference. Dim env As New XmlDsigEnvelopedSignatureTransform env = New XmlDsigEnvelopedSignatureTransform() reference.AddTransform(env) Dim c14 As New XmlDsigC14NTransform c14 = New XmlDsigC14NTransform() reference.AddTransform(c14) ' Add the reference to the SignedXml object. signedXml.AddReference(reference) ' Create a new KeyInfo object Dim keyinfo As New KeyInfo keyinfo = New KeyInfo() ' Load the certificate into a KeyInfoX509Data object ' and add it to the KeyInfo object. keyinfo.AddClause(New KeyInfoX509Data(_X509Cert)) ' Add the KeyInfo object to the SignedXml object. signedXml.KeyInfo = keyinfo signedXml.ComputeSignature() ' Get the XML representation of the signature and save ' it to an XmlElement object. Dim xmlDigitalSignature As XmlElement xmlDigitalSignature = signedXml.GetXml() ' Gravar o elemento no documento XML doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True)) XmlDoc = New XmlDocument() XmlDoc.PreserveWhitespace = False XmlDoc = doc ' Atualizar a string do XML já assinada vXMLStringAssinado = XmlDoc.OuterXml ' Gravar o XML no HD ' abre um stream para escrita e cria um StreamWriter para implementar o stream Dim fs As New FileStream(pArqXMLAssinar, FileMode.OpenOrCreate, FileAccess.Write) Dim SW_2 As New StreamWriter(fs) SW_2.Flush() SW_2.BaseStream.Seek(0, SeekOrigin.Begin) SW_2.Write(vXMLStringAssinado) SW_2.Flush() SW_2.Close() Catch ex As Exception vResultado = 6 vResultadoString = "Erro ao assinar o documento - " + ex.Message End Try End If End If Catch ex As Exception vResultado = 3 vResultadoString = "XML mal formado - " + ex.Message End Try End If Catch ex As Exception vResultado = 1 vResultadoString = "Problema ao acessar o certificado digital" + ex.Message End Try End Sub End Class Compartilhar este post Link para o post Compartilhar em outros sites
KhaosDoctor 242 Denunciar post Postado Dezembro 13, 2013 Cara você já fez este post, vou remover a duplicada. Compartilhar este post Link para o post Compartilhar em outros sites