MAPEAR XSD TYPES DA NFE

EMERSONTADEU 09/09/2009 07:41:51
#322353
Bom dia, é muito importante para mim conseguir criar um validador de campos da NFe Off-line pois recebo dados de várias partes sem nenhum controle de tamanho, tipo, collation ou seja lá qual for e cabe a mim arrumar toda esta bagunça ... gerar XML inteiro de NFe e rezar pela sua validação na receita não está me ajudando muito ... por isto gostaria que se possível alguém me ajudasse a mapear direito as restrições para depois poder usar as Expressões regulares registradas nos Schemas que a receita disponibiliza atravéz das PL00X.zip da vida.
O problema aqui ocorre na falha do um algorítimo de serialização interno que carrega o ds, ou seja, os includes e imports da vida precisariam ser consolidados num único XSD para o Xdoc ser gerado estruturado como um dataset correto com todos os tipos complexos ou simples.
O grande lance desta idéia é que poderia-se criar objetos de validação dinânicos que seriam utilizáveis dentro de qualquer aplicação e bastaria mudar o arquivo XDS do diretório base que as aplicação atualizaria suas regras sem necessidade de recompilação.
Indo mais longe o Infopath e o WPF pode usar este xml para gerar telas dinamicamente !!!
Isto a M$ está chamand de SOM [Ô]Schema Object Model[Ô] e faz parte da Framework 4.0 ... mas é mais propaganda do que novidade tecnológica pois a maioria das funcionalidade já existem desde a FW 1.0.
Creio que estou dando um pontapé inicial razoável, se alguém puder me ajudar serei muito grato !


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim xmlFN As String = [Ô]NFE-sch\NFe_v1.10.xsd[Ô]
Dim ds As New DataSet
ds.ReadXmlSchema(xmlFN)
For Each dt As DataTable In ds.Tables
RichTextBox1.Text += dt.TableName & vbCrLf
For Each c As DataColumn In dt.Columns
Dim strCS As String = c.ColumnName & vbTab & [Ô]:[Ô] & vbTab & [Ô]:[Ô] & c.DataType.ToString & [Ô]:[Ô] & c.MaxLength
RichTextBox1.Text += vbTab & strCS & vbCrLf
Next
Next
End Sub


O resultado parcial que temos é (Vejam que as regras foram perdidas ... todos is itens que seriam enumeradores viraram -1 o limite)

[NFe]
NFe_Id : :System.Int32:-1
[infNFe]
versao : :System.String:-1
Id : :System.String:-1
infNFe_Id : :System.Int32:-1
NFe_Id : :System.Int32:-1
[ide]
cUF : :System.String:-1
cNF : :System.String:-1
natOp : :System.String:60
indPag : :System.String:-1
mod : :System.String:-1
serie : :System.String:-1
nNF : :System.String:-1
dEmi : :System.String:-1
dSaiEnt : :System.String:-1
tpNF : :System.String:-1
cMunFG : :System.String:-1
tpImp : :System.String:-1
tpEmis : :System.String:-1
cDV : :System.String:-1
tpAmb : :System.String:-1
finNFe : :System.String:-1
procEmi : :System.String:-1
verProc : :System.String:20
ide_Id : :System.Int32:-1
infNFe_Id : :System.Int32:-1
[NFref]
refNFe : :System.String:-1
NFref_Id : :System.Int32:-1
ide_Id : :System.Int32:-1
EMERSONTADEU 09/09/2009 08:13:32
#322355
Infelizmente meu tempo de estudo terminou, mas me parece que a resposta está neste link ...

http://blogs.msdn.com/stan_kitsis/archive/2005/08/06/448572.aspx

Vou deixar guardado aqui, talvez possa ser útil depois.
EMERSONTADEU 10/09/2009 02:46:34
#322448
Gostei: todo e qualquer XML mapeado recursivamente e deixa vc escolher o que fazer com cada tipo de particula encontrar.
O mundo vai se tornar um lugar mais fácil, validar NFe Offline vai ser o bixo para mim !

 
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.Schema.XmlSchemaSet
Imports System.Collections
Imports System.Xml.Serialization
Imports System.IO

Public Class Form2

Dim NFeTipos As New Collection
Dim oNFeType As NFeType = Nothing
Dim ss As New XmlSchemaSet

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strXSD As String = [Ô][Ô]
For i = 1 To 3
Select Case i
Case 1
strXSD = [Ô]NFE-sch\xmldsig-core-schema_v1.01.xsd[Ô]
Case 2
strXSD = [Ô]NFE-sch    iposBasico_v1.02.xsd[Ô]
Case 3
strXSD = [Ô]NFE-sch\leiauteNFe_v1.10.xsd[Ô]
[ô]Case 4
[ô] strXSD = [Ô]NFE-sch
fe_v1.10.xsd[Ô]
End Select
Dim reader As New XmlTextReader(strXSD)
Dim myschema As XmlSchema = XmlSchema.Read(reader, Nothing)
ss.Add(myschema)
Next
ss.Compile()
start(ss)


End Sub

Private Sub walkTheParticle(ByVal particle As XmlSchemaParticle)
If (TypeOf (particle) Is XmlSchemaElement) Then
Dim elem As XmlSchemaElement = particle
[ô]// todo: insert your processing code here for elements

RichTextBox1.Text += [Ô][[Ô] & elem.Name & [Ô]][Ô] & vbCrLf
If (elem.RefName.IsEmpty) Then
Dim type As XmlSchemaType = elem.ElementSchemaType()
If (TypeOf (type) Is XmlSchemaComplexType) Then
Dim ct As XmlSchemaComplexType = type
If (ct.QualifiedName.IsEmpty) Then
walkTheParticle(ct.ContentTypeParticle)
End If
End If
ElseIf (TypeOf (particle) Is XmlSchemaGroupBase) Then
Dim baseParticle As XmlSchemaGroupBase = particle
For Each subParticle As XmlSchemaParticle In baseParticle.Items
walkTheParticle(subParticle)
Next
End If
End If
End Sub

Private Sub start(ByVal ss As XmlSchemaSet)
For Each schema As XmlSchema In ss.Schemas
For Each type As XmlSchemaType In schema.SchemaTypes.Values
If (TypeOf (type) Is XmlSchemaComplexType) Then
Dim ct As XmlSchemaComplexType = type
walkTheParticle(ct.ContentTypeParticle)
End If
Next
For Each el As XmlSchemaElement In schema.Elements.Values
walkTheParticle(el)
Next
For Each xsa As XmlSchemaAnnotated In schema.Items
If (TypeOf (xsa) Is XmlSchemaGroup) Then
Dim xsg As XmlSchemaGroup = xsa
walkTheParticle(xsg.Particle)
End If
Next
Next
End Sub
End class
Tópico encerrado , respostas não são mais permitidas