Página 1 de 1
Como Validar Estructura del XML?
Publicado: Mié Dic 08, 2010 4:11 pm
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!

gracias!

Re: Como Validar Estructura del XML?
Publicado: Mié Dic 08, 2010 4:40 pm
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!

gracias!

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.
Re: Como Validar Estructura del XML?
Publicado: Jue Dic 09, 2010 9:45 am
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
Re: Como Validar Estructura del XML?
Publicado: Mar Dic 14, 2010 12:25 am
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
Re: Como Validar Estructura del XML?
Publicado: Lun Feb 28, 2011 9:55 am
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 ;
}