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 :)
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


0