viernes, 13 de febrero de 2015

Validar XML con XSD en HARBOUR


Harbour, parece, que no aporta alguna librería de validación de XML a través de un XSD.
Si usamos Windows, vamos a usar las librerías de Microsoft que nos aporta.

¿ Para que sirve validar un XML ? Para evitarnos dolores de cabeza.

Si nuestra XSD determina que el tipo de dato  un atributo es un valor del tipo int, si
nos lleva un tipo String, con la validación, saltará la alarma antes de continuar mirando
donde esta el error.

Esta función recibe el fichero XML y el XSD que tiene que usar y devuelve true si se valida.

if Validate_XSD( "test.xml", "test.xsd" )
   ... SIGO con XML
endif
 //-----------------------------------------------------------------------
// Source Code
//-----------------------------------------------------------------------
function Validate_XSD( cFileXML, cFileXSD )
   Local oXmlDoc, oSchema, oSchemaCache, oParseError
   Local lOk := .f.
 
   oXmlDoc := CreateObject("Msxml2.DOMDocument.6.0")
   oXmlDoc:async := .F.
   oXmlDoc:validateOnParse := .F.
   oXmlDoc:resolveExternals = .F.

   oXmlDoc:load( cFileXML )
   //oXmlDoc:loadXML( cString_XML )  // Usar variable con contenido XML

   oSchema := CreateObject("Msxml2.DOMDocument.6.0")
   oSchema:async := .F.
   oSchema:load( cFileXSD )
   //oSchema:loadXML( cString_XSD )

   oSchemaCache := CreateObject("Msxml2.XMLSchemaCache.6.0")
   oSchemaCache:add( "", oSchema )

   oXmlDoc:schemas := oSchemaCache

   oParseError := oXmlDoc:validate()
 
   if !empty( oParseError:errorCode )
      Alert( Cstr( oParseError:errorCode ) + "#"+ cStr( oParseError:reason ) )
   else
      lOk := .t. 
   endif  

return lOk


Aqui dejo un fichero XML y XSD de prueba. Cambiar la cadena texto por un entero para que comprobeis que esta haciendolo ok.

//-----------------------------------------------------------------------
// test.xml
//-----------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<testfile xsi:noNamespaceSchemaLocation="test.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <companyName>texto</companyName>
</testfile>



//-----------------------------------------------------------------------
// test.xsd
//-----------------------------------------------------------------------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="testfile">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="companyName" type="xs:int"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...