XML - Xercesc validación de xml contra schema

 
Vista:

Xercesc validación de xml contra schema

Publicado por KimRamone (1 intervención) el 22/01/2008 15:46:12
Hola a todos!

Estoy intentando implementar una funcion que valide un xml con un xsd que he creado. Utilizo xerces y C++.

Por un lado he comprobado que el schema es correcto (con el comando "xmllint -schema pathdelxsd"de linux) y que mi xml es válido conforme a ese schema (con "xmllint -schema pathdelxsd pathdelxml"). Mis dos ficheros, que están en el mismo directorio, son los siguientes:

areas.xml:

<?xml version="1.0" encoding="UTF-8"?>
<areas_of_interest xmlns="your:namespace:here" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="your:namespace:here file:areas_of_interest.xsd">
<area name="area1">
<grid_point>1245</grid_point>
<grid_point>1246</grid_point>
<grid_point>1247</grid_point>
</area>
<area name="area2">
<grid_range>
<first>2245</first>
<last>2245</last>
</grid_range>
</area>
<area name="area3">
<grid_point>3000</grid_point>
<grid_point>3001</grid_point>
<grid_point>3002</grid_point>
<grid_range>
<first>3050</first>
<last>3057</last>
</grid_range>
</area>
</areas_of_interest>


areas_of_interest.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="your:namespace:here" elementFormDefault="qualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:annotation>
<xsd:documentation xml:lang="en">
Schema for areas of interest file to be used in the extraction
configuration files.
</xsd:documentation>
</xsd:annotation>

<xsd:element name="areas_of_interest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="area" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="area">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="grid_point" type="xsd:decimal" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="grid_range" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- <xsd:unique name="name">
<selector xpath="areas_of_interest/area"/>
<field xpath="@name"/>
</xsd:unique> -->
</xsd:element>

<xsd:element name="grid_range">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="first" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
<xsd:element name="last" type="xsd:decimal" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

</xsd:schema>

Tengo dudas sobre si las cabeceras serán correctas o no... No sé si los dos archivos estan bien enlazados. He supuesto que sí porque el xmllint no se queja, pero el problema llega al intentar validar el archivo en C++ con xerces, ya que cambiando el xml a proposito para que me de un error de validacion, el código no lo reconoce, mientras que el comando xmllint muestra por pantalla claramente cual es el error.
Mi funcion para validar el archivo en c++ es la siguiente:

int ValidateFile(char *fileName){
//Initialize xerces DOM parser.
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Error during initialization! : "
<< message << " ";
XMLString::release(&message);
return 1;
}
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true); // optional

ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);

char* xmlFile = fileName;

//parse file and print error
try {
parser->parse(xmlFile);
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: "
<< message << " ";
XMLString::release(&message);
return -1;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: "
<< message << " ";
XMLString::release(&message);
return -1;
}
catch (...) {
cout << "Unexpected Exception " ;
return -1;
}

delete parser;
delete errHandler;

return 0;

}

Siempre devuelve 0, como si no se encontrase con ningun error... Alguien sabe por qué me sucede esto??

Muchas gracias por adelantado :)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Xercesc validación de xml contra schema

Publicado por Christian Castet (1 intervención) el 20/01/2010 18:13:21
Hola yo tambien tengo problemas con xerces c++.
Pero parece que ya tengo algo que me valida y mas o menos funciona.

yo estoy intentando validar el xsd antes de realizar la validacion del xml con el esquema y tu dices que lo has comprobado con el comando ""xmllint --schema file_xsd"" yo cuando ejecuto este comando me sale la ayuda del comando xmllint.

A ver si nos podemos ayudar mutuamente.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar