Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


CARTA PORTE V3.1

ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03


.

Como Validar Estructura del XML?

La factura esta basada en XML, independiente del lenguaje de programacion todos debemos saber acerca de esta tecnologia
[[ FORO CERRADO DEBIDO A QUE YA LA INFORMACION YA NO ES VIGENTE ]]
Cerrado
aldaking
Mensajes: 19
Registrado: Mar Nov 09, 2010 9:41 am

Como Validar Estructura del XML?

Mensaje por aldaking »

Hola amigos de Valida!

tengo una duda, que tal vez ya la han puesto pero no encontre algo en este foro...

mi duda es como puedo validar la estructura del XML, es decir si a mi me envian un CFD ya con sello y certificado y todo...
lo que quiero hacer es validar que tenga la estructura correcta, que es segun el anexo 20...
el documento entrante tiene la obligacion de venir con una estructura definida o puede ser cualquier estructura, solo que contenga los datos correctos??

y esto de validar el XML lo quiero hacer mediante C#, alguna idea?? :S

saludos y espero sus respuestas! :D
gracias! :D
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Como Validar Estructura del XML?

Mensaje por Dado »

aldaking escribió:Hola amigos de Valida!

tengo una duda, que tal vez ya la han puesto pero no encontre algo en este foro...

mi duda es como puedo validar la estructura del XML, es decir si a mi me envian un CFD ya con sello y certificado y todo...
lo que quiero hacer es validar que tenga la estructura correcta, que es segun el anexo 20...
el documento entrante tiene la obligacion de venir con una estructura definida o puede ser cualquier estructura, solo que contenga los datos correctos??

y esto de validar el XML lo quiero hacer mediante C#, alguna idea?? :S

saludos y espero sus respuestas! :D
gracias! :D

Hay dos formas, la facil es usando la definicion de la estructura XSD que publico el SAT (cfdv2.xsd), el pequeño inconveniente es que esta forma es tan automatizada que no tienes mucho control, basicamente obtienes un pasa/no pasa aunque talvez eso es suficiente para lo que necesitas

La otra es haciendo un recorrido recursivo a cada nodo y probando sus valores contra el Anexo 20. Este metodo es mucho mas elaborado pero tienes el control de todo, esta es la forma en la que el ValidaCFD funciona.
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
aldaking
Mensajes: 19
Registrado: Mar Nov 09, 2010 9:41 am

Re: Como Validar Estructura del XML?

Mensaje por aldaking »

de hecho si, creo que solo necesito eso de pasa o no pasa, pero bueno como es que se utiliza esta estructura XSD para comparar....
se supone que yo tengo mi xml ya sellado, y todo, porque otro proveedor me lo envio y al leerlo el xml en mi codigo, que es lo que tengo que hacer???
o como lo comparo con XSD, eso no me queda del todo claro :S
agallardor13
Mensajes: 60
Registrado: Mié Oct 13, 2010 9:28 pm

Re: Como Validar Estructura del XML?

Mensaje por agallardor13 »

Te envío un ejemplo de como lo hago yo en vb.net unicamente te tocará convertirlo a C#

Código: Seleccionar todo

    ''' <summary>
    ''' Return true if CFD is valid and well formmed XML.
    ''' </summary>
    ''' <param name="XSDPath"></param>
    ''' <param name="XMLPath"></param>
    ''' <param name="ResultMessage"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function IsCFDXmlValid(ByVal XSDPath As String, ByVal XMLPath As String, ByRef ResultMessage As String) As Boolean
        Try
            ' 0- Initialize variables...
            _IsValid = True
            _ResultMessage = ""
            If Not (File.Exists(XMLPath)) Then
                ResultMessage = String.Format("Archivo '{0}' no existe.", XMLPath)
                Return False
            End If

            ' 1- Read XML file content
            Reader = New XmlTextReader(XMLPath)

            ' 2- Read Schema file content
            Dim SR As New StreamReader(XSDPath)

            ' 3- Create a new instance of XmlSchema object
            Dim Schema As New XmlSchema

            ' 4- Set Schema object by calling XmlSchema.Read() method
            Schema = XmlSchema.Read(SR, New ValidationEventHandler(AddressOf ReaderSettings_ValidationEventHandler))

            ' 5- Create a new instance of XmlReaderSettings object
            Dim ReaderSettings As New XmlReaderSettings

            ' 6- Set ValidationType for XmlReaderSettings object
            ReaderSettings.ValidationType = ValidationType.Schema

            ' 7- Add Schema to XmlReaderSettings Schemas collection
            ReaderSettings.Schemas.Add(Schema)

            ' 8- Add your ValidationEventHandler address to
            ' XmlReaderSettings ValidationEventHandler
            AddHandler ReaderSettings.ValidationEventHandler, New ValidationEventHandler(AddressOf ReaderSettings_ValidationEventHandler)

            ' 9- Create a new instance of XmlReader object
            Dim objXmlReader As XmlReader = XmlReader.Create(Reader, ReaderSettings)

            ' 10- Read XML content in a loop
            While objXmlReader.Read
                ' empty loop
            End While

            'Se cierra el validador
            objXmlReader.Close()

            ResultMessage = _ResultMessage

            Return _IsValid
        Catch AccessEx As UnauthorizedAccessException
            Throw AccessEx
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Sub ReaderSettings_ValidationEventHandler(ByVal Sender As Object, ByVal args As ValidationEventArgs)
        ' 11- Implement your logic for each validation iteration
        Dim strTemp As String = "Line: " & Reader.LineNumber & " - Position: " & Reader.LinePosition & " - " & args.Message
        _ResultMessage &= strTemp
        _IsValid = False
    End Sub
danfred
Mensajes: 4
Registrado: Vie Feb 25, 2011 11:03 am

Re: Como Validar Estructura del XML?

Mensaje por danfred »

Aqui la version en c#

XmlTextReader Reader = null;
bool _IsValid = false;
string _ResultMessage = "";

public bool IsCFDXmlValid(string XSDPath, string XMLPath)
{
try
{
// 0- Initialize variables...
_IsValid = true;
_ResultMessage = "";

if (File.Exists(XMLPath) == false)
{
_ResultMessage = String.Format("Archivo '{0}' no existe.", XMLPath);
return false;
}

// 1- Read XML file content
Reader = new XmlTextReader(XMLPath);

// 2- Read Schema file content
StreamReader SR = new StreamReader(XSDPath);

// 3- Create a new instance of XmlSchema object
XmlSchema Schema = new XmlSchema();

// 4- Set Schema object by calling XmlSchema.Read() method
Schema = XmlSchema.Read(SR, new ValidationEventHandler(ReaderSettings_ValidationEventHandler));

// 5- Create a new instance of XmlReaderSettings object
XmlReaderSettings ReaderSettings = new XmlReaderSettings();

// 6- Set ValidationType for XmlReaderSettings object
ReaderSettings.ValidationType = ValidationType.Schema;

// 7- Add Schema to XmlReaderSettings Schemas collection
ReaderSettings.Schemas.Add(Schema);

// 8- Add your ValidationEventHandler address to
// XmlReaderSettings ValidationEventHandler
ReaderSettings.ValidationEventHandler += new ValidationEventHandler( ReaderSettings_ValidationEventHandler);

// 9- Create a new instance of XmlReader object
XmlReader objXmlReader = XmlReader.Create(Reader, ReaderSettings);

// 10- Read XML content in a loop
while (objXmlReader.Read())
{
// empty loop
}

// Se cierra el validador
objXmlReader.Close();

return _IsValid;
}
catch (Exception ex)
{
_ResultMessage = "Error al validar el XML:" + ex.ToString();
return true;
}

}

private void ReaderSettings_ValidationEventHandler(Object Sender, ValidationEventArgs args )
{
// 11- Implement your logic for each validation iteration
string strTemp = "Linea: " + Reader.LineNumber + " - Posición: " + Reader.LinePosition + " - " + args.Message;
_ResultMessage += strTemp;
_IsValid = false ;
}
Cerrado