Hi Alessandra,
the location of the file should be a valid URI, so you should replace
spaces with %20
Alberto
Il 12/09/2011 21:52, [email protected] ha scritto:
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