Alberto: Thankyou very much. The code now works, and correctly flags up
validation errors in the XML. Much appreciated. (We have spent a lot of time
chasing this, so it is a relief to finally get it working.) 

Leif


Alberto Massari wrote:
> 
> Hi Leif,
> there is an extra setting missing:
> 
>     parser->setValidationScheme(SAXParser::Val_Auto); // or Val_Always, 
> if you prefer
> 
> Alberto
> 
> Leif Goodwin ha scritto:
>> Alberto. Apologies for missing your comment. (Easily done since they were
>> embedded in long quotes.) I corrected the code and found that the
>> setExternalSchemaLocation method cannot cope with folder names that
>> contain
>> whitespace. Moving the schema to a new file location, or replacing each
>> space with %20, and trying the new code, it still does not work. The
>> extra
>> illegal child element in the root element is not picked up as an error.
>> Incidentally we use a schema with a targetNamespace. 
>>
>> Test XML file: 
>>
>> <?xml version="1.0"?>
>> <driller-data 
>>      xmlns="http://tempuri.org/DrillerData_1.0.xsd";
>>      date="8 July 2009" drill-unit="Mickey Mouse"  driller = "Joe Smith"
>> shot-point-number="1" drill-depth="10.5" drill-type="conventional">
>> <dummy test="4"/>
>> </driller-data>
>>
>> Test schema file: 
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <xs:schema targetNamespace="http://tempuri.org/DrillerData_1.0.xsd";
>> elementFormDefault="qualified"
>> xmlns="http://tempuri.org/DrillerData_1.0.xsd";
>> xmlns:xs="http://www.w3.org/2001/XMLSchema";>
>>   <xs:element name="driller-data">
>>     <xs:complexType>
>>       <xs:attribute name="date" type="xs:dateTime"/>
>>       <xs:attribute name="drill-unit" type="xs:string" />
>>       <xs:attribute name="driller" type="xs:string" />
>>       <xs:attribute name="shot-point-number" type="xs:int" />
>>       <xs:attribute name="drill-depth" type="xs:float" />
>>       <xs:attribute name="drill-type">
>>         <xs:simpleType>
>>           <xs:restriction base="xs:string">
>>             <xs:enumeration value="conventional" />
>>             <xs:enumeration value="lightway" />
>>           </xs:restriction>
>>         </xs:simpleType>
>>       </xs:attribute>
>>     </xs:complexType>
>>   </xs:element>
>> </xs:schema>
>>
>> As you can see the schema allows some attributes and no child elements. 
>>
>> And to avoid misundertandings, the code: 
>>
>>     /* actual xerces work */ 
>>     char *xml_file = "D:\\Development\\Chronicle\\Example Schemas and
>> Form
>> Templates\\DrillData_1.xml"; 
>>     char *xml_schema = "D:\\Development\\Chronicle\\Example Schemas and
>> Form
>> Templates\\newDrillData.xsd"; 
>>     SAXParser *parser = new SAXParser(); 
>>
>>     CSaxParserErrorHandler errorHandler;
>>     parser->setErrorHandler(&errorHandler);
>>
>>     parser->setDoNamespaces(true); 
>>     parser->setDoSchema(true);
>>
>>
>>     try 
>>     { 
>>        
>> parser->setExternalSchemaLocation("http://tempuri.org/DrillerData_1.0.xsd
>> D:\\Development\\Chronicle\\Example%20Schemas%20and%20Form%20Templates\\newDrillData.xsd");
>>         //parser->setExternalNoNamespaceSchemaLocation (xml_schema); 
>>         parser->parse(xml_file); 
>>         return true; 
>>     } 
>>     catch (const XMLException &e) { 
>>         char *message = XMLString::transcode(e.getMessage()); 
>>         //qDebug() << "XML Exception is: " << message << endl; 
>>         XMLString::release(&message); 
>>     } 
>>     catch(...) 
>>     { 
>>         //qDebug() << "XML Unexpected exception" << endl; 
>>     } 
>>
>> Corrupting the XML file so that the XML is not well formed e.g. remove
>> the
>> <driller-data> line, and an error is indicated. 
>>
>> Leif
>>
>>
>>
>>
>> Alberto Massari wrote:
>>   
>>> It looks you didn't read my e-mail; I said
>>>
>>> "Furthermore, in order to use schema, you should invoke
>>> setDoSchema(true)
>>> Finally, change the setExternalSchemaLocation to be 
>>> setExternalNoNamespaceSchemaLocation (or, if schema.xsd is using a 
>>> targetNamespace, change the argument of setExternalSchemaLocation to be 
>>> "uri schema.xsd") "
>>>
>>> Alberto
>>>
>>> Leif Goodwin ha scritto:
>>>     
>>>> We've tried the above code and it does not validate the XML file. All
>>>> it
>>>> does
>>>> is check that it is well formed. Here is the hacked code: 
>>>>
>>>>     /* initialize xerces system before usig API: DOM, SAX, SAX2 */ 
>>>>     try { 
>>>>         xercesc::XMLPlatformUtils::Initialize(); 
>>>>     } 
>>>>     catch (const XMLException &e) { 
>>>>         char *message = XMLString::transcode(e.getMessage()); 
>>>>         //qDebug() << "Error during XML initialization: " << message <<
>>>> endl; 
>>>>         XMLString::release(&message); 
>>>>         //return; 
>>>>     } 
>>>>
>>>>     /* actual xerces work */ 
>>>>     char *xml_file = "D:\\Development\\Chronicle\\Example Schemas and
>>>> Form
>>>> Templates\\DrillData_1.xml"; 
>>>>     char *xml_schema = "D:\\Development\\Chronicle\\Example Schemas and
>>>> Form
>>>> Templates\\newDrillData.xsd"; 
>>>>     SAXParser *parser = new SAXParser(); 
>>>>
>>>>     CSaxParserErrorHandler errorHandler;
>>>>     parser->setErrorHandler(&errorHandler);
>>>>
>>>>     //parser->setDoValidation(true); 
>>>>     parser->setDoNamespaces(true); 
>>>>
>>>>     try 
>>>>     { 
>>>>         parser->setExternalSchemaLocation(xml_schema); 
>>>>         parser->parse(xml_file); 
>>>>         return true; 
>>>>     } 
>>>>     catch (const XMLException &e) 
>>>>     { 
>>>>         char *message = XMLString::transcode(e.getMessage()); 
>>>>         //qDebug() << "XML Exception is: " << message << endl; 
>>>>         XMLString::release(&message); 
>>>>     } 
>>>>     catch(...) 
>>>>     { 
>>>>         //qDebug() << "XML Unexpected exception" << endl; 
>>>>     } 
>>>>
>>>>     delete parser; 
>>>>     //delete doc_handler; 
>>>>
>>>>     /* terminate and cleanup */ 
>>>>     XMLPlatformUtils::Terminate(); 
>>>>
>>>> The XML file purposefully has an extra element which is not allowed by
>>>> the
>>>> schema. But the parser accepts it. 
>>>>
>>>> Here is the quickly knocked together error handler: 
>>>>
>>>> class CSaxParserErrorHandler : public xercesc_3_0::ErrorHandler
>>>> {
>>>>     virtual void warning(const SAXParseException& exc);
>>>>     virtual void error(const SAXParseException& exc);
>>>>     virtual void fatalError(const SAXParseException& exc);
>>>>     void resetErrors()
>>>>     {
>>>>     }
>>>>
>>>> };
>>>>
>>>> void CSaxParserErrorHandler::warning(const SAXParseException& exc)
>>>> {
>>>>     CReport::Warning(
>>>>         "File: %s, line %d, column %d : %s",
>>>>         StrX(exc.getSystemId()), 
>>>>         (int)exc.getLineNumber(),
>>>>         (int)exc.getLineNumber(),
>>>>         StrX(exc.getMessage()));
>>>> }
>>>>
>>>> void CSaxParserErrorHandler::error(const SAXParseException& exc)
>>>> {
>>>>     CReport::Error(
>>>>         "File: %s, line %d, column %d : %s",
>>>>         StrX(exc.getSystemId()), 
>>>>         (int)exc.getLineNumber(),
>>>>         (int)exc.getLineNumber(),
>>>>         StrX(exc.getMessage()));
>>>> }
>>>>
>>>> void CSaxParserErrorHandler::fatalError(const SAXParseException& exc)
>>>> {
>>>>     CReport::Error(
>>>>         "(Fatal Error) File: %s, line %d, column %d : %s",
>>>>         StrX(exc.getSystemId()), 
>>>>         (int)exc.getLineNumber(),
>>>>         (int)exc.getLineNumber(),
>>>>         StrX(exc.getMessage()));
>>>> }
>>>>
>>>>   
>>>>       
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>>
>>>     
>>
>>   
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/validating-xml-with-xsd-schema-tp23315036p23522096.html
Sent from the Xerces - C - Dev mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to