I replaced parser->setProperty(XMLUni::fgXercesSchemaExternalSchemaLocation,schemaSorgente);
con parser->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,schemaSorgente); I no longer have the error on schemalocator but I get the following error enable entities to open prumary C: / Documents ..... /?????d???1???. And then I printed a series of errors such as: -no declaration found for element personnel. I think I can not open or find the file. xsd. What could be the problem, run the code as a console project in VisualStudio 2008. Any idea on the problem? ----Messaggio originale---- Da: [email protected] Data: 12-set-2011 14.21 A: "[email protected]"<[email protected]>, "[email protected]"<[email protected]> Ogg: RE: Re: Validation documents with SAX in C++ The error is in your XML. If you use the schemaLocation attribute, its value must consist of namespace and schema location pairs separated by spaces. To specify just a location use the noNamespaceSchemaLocation attribute instead of the schemaLocation attribute. -----Original Message----- From: [email protected] [mailto:[email protected]] Sent: Monday, September 12, 2011 8:08 AM To: [email protected] Subject: R: Re: Validation documents with SAX in C++ I implemented the following algorithm: int main(int argC, char* argV[]) { char* filename; bool dtdValidate = false; bool xsdValidate = false; char* schemaSorgente; char* dtdSorgente; int i; try { XMLPlatformUtils::Initialize(); } catch (const XMLException&amp; toCatch) { XERCES_STD_QUALIFIER cerr << "Si รจ verificato un errore in fase di inizializzazione! :\n" << StrX(toCatch.getMessage()) << XERCES_STD_QUALIFIER endl; return 1; } for (i = 1; i < argC; i++) { if (!strcmp(argV[i], "-dtd")) { dtdValidate = true; dtdSorgente = argV[++i]; } else if (!strcmp(argV[i], "-xsd")) { xsdValidate = true; schemaSorgente = argV[++i]; }} xmlFile = argV[3]; int errorCount = 0; SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); parser->setFeature(XMLUni::fgSAX2CoreValidation, true); parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true); parser->setProperty(XMLUni::fgXercesSchemaExternalSchemaLocation,schemaSorgente); int errorCode = 0; try { XmlToTestoSAX handler(encodingName, unRepFlags); // parser->setDocumentHandler(&amp;handler); parser->setErrorHandler(&amp;handler); parser->parse(xmlFile); errorCount = parser->getErrorCount(); } catch (const OutOfMemoryException&amp;) { XERCES_STD_QUALIFIER cerr << "OutOfMemoryException" << XERCES_STD_QUALIFIER endl; errorCode = 5; } catch (const XMLException&amp; toCatch) { XERCES_STD_QUALIFIER cerr << "\nAn error occurred\n Error: " << StrX(toCatch.getMessage()) << "\n" << XERCES_STD_QUALIFIER endl; errorCode = 4; } if(errorCode) { XMLPlatformUtils::Terminate(); return errorCode; } // // Delete the parser itself. Must be done prior to calling Terminate, below. // delete parser; // And call the termination method XMLPlatformUtils::Terminate(); if (errorCount > 0) return 4; else return 0; }; but I believe there are errors. Pass the following parameters from the command line: -xsd xml\personal.xsd xml\personal-schema.xml The xml file input is given in the following: <?xml version="1.0" encoding="UTF-8"?> <?proc-inst-1 'foo' ?> <personnel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="C:/Documents and Settings/Alessandra/Documenti/Visual Studio 2008/Projects/XmlToTestoSAXMain/xml/personal.xsd" > <person id="Big.Boss"> <name xml:base="foo/bar"><family xml:base="bar/bar">Boss</family> <given xml:base="car/bar">Big</given><?proc-inst-2 'foobar' ?></name> <email>[email protected]</email> <link subordinates="one.worker two.worker three.worker four.worker five.worker"/> </person> <person id="one.worker" xml:base="/auto/bar"> <name xml:base="/car/foo/"><family xml:base="bar/bar">Worker</family> <given>One</given></name> <email>[email protected]</email> <link manager="Big.Boss"/> </person> </personnel> XSD schema is: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'> <xs:import namespace="http://www.w3.org/XML/1998/namespace"> <xs:annotation> <xs:documentation> The schemaLocation of the relevant file is "http://www.w3.org/2001/xml.xsd"; however, we don't want to assume people are always connected to the 'net when playing with this file. </xs:documentation> </xs:annotation> </xs:import> <xs:element name="personnel"> <xs:complexType> <xs:sequence> <xs:element ref="person" minOccurs='1' maxOccurs='unbounded'/> </xs:sequence> </xs:complexType> <xs:unique name="unique1"> <xs:selector xpath="person"/> <xs:field xpath="name/given"/> <xs:field xpath="name/family"/> </xs:unique> <xs:key name='empid'> <xs:selector xpath="person"/> <xs:field xpath="@id"/> </xs:key> <xs:keyref name="keyref1" refer='empid'> <xs:selector xpath="person"/> <xs:field xpath="link/@manager"/> </xs:keyref> </xs:element> <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element ref="email" minOccurs='0' maxOccurs='unbounded'/> <xs:element ref="url" minOccurs='0' maxOccurs='unbounded'/> <xs:element ref="link" minOccurs='0' maxOccurs='1'/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use='required'/> <xs:attribute name="note" type="xs:string"/> <xs:attribute name="contr" default="false"> <xs:simpleType> <xs:restriction base = "xs:string"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="salary" type="xs:integer"/> <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/> </xs:complexType> </xs:element> <xs:element name="name"> <xs:complexType> <xs:all> <xs:element ref="family"/> <xs:element ref="given"/> </xs:all> <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/> </xs:complexType> </xs:element> <xs:element name="family"> <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="given" > <xs:complexType> <xs:simpleContent> <xs:extension base='xs:string'> <xs:anyAttribute namespace="http://www.w3.org/XML/1998/namespace" processContents="skip"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> <xs:element name="email" type='xs:string'/> <xs:element name="url"> <xs:complexType> <xs:attribute name="href" type="xs:string" default="http://"/> </xs:complexType> </xs:element> <xs:element name="link"> <xs:complexType> <xs:attribute name="manager" type="xs:IDREF"/> <xs:attribute name="subordinates" type="xs:IDREFS"/> </xs:complexType> </xs:element> <xs:notation name='gif' public='-//APP/Photoshop/4.0' system='photoshop.exe'/> </xs:schema> When you launch the program running I get the following screen: Fatal error at file C:\Documents and Settings\Alessandra\Documenti\Visual Studio 2008\Projects\XmlToTestoSAXMain\xml\personal-schema.xml, line 6, char 6 Message: schemaLocation does not contain name-space location pairs There are errors in the file. Xml or. Xsd? Furthermore, my algorithm allows to validate an XML document based on a DTD or XSD supplied from the outside? Thank you. greetings ----Messaggio originale---- Da: [email protected] Data: 9-set-2011 8.20 A: <[email protected]> Ogg: Re: Validation documents with SAX in C++ [email protected] wrote: > Hello, you can have some indication of the methods used to check whether an > XML document conforms to a DTD or XSD with SAX in C++. > Thank you. Alessandra greetings. Hi, Please look at the SAX2Count sample source code from the Xerces-C++ source distribution. Good luck! Vitaly
