Re: libxml2 does xmlSchemaValidateDoc() support xml schema extensions?

Hi Piortr


I still can not validate xml that uses xml schema extensions. I think I figured out what the problem might be, but do not know how to resolve i. I wonder if the problem is with the way I set up my xml namespace?

<zoo:cageRequest xmlns:zoo="http://www.example.org/Zoo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

I am setting up the xml schema namespace the same way eclipse does when you create a new XSD or XML file. I entered http://www.w3.org/2001/XMLSchema-instance in the address bar of my browsers and got quite a surprise!
 <xs:annotation>
  <xs:documentation><p>This schema should never be used as such:
                    <a href="http://www.w3.org/TR/xmlschema-1/#no-xsi">the XML
                    Schema Recommendation</a> forbids the declaration of
                    attributes in this namespace</p>
  </xs:documentation>
 </xs:annotation>
http://www.w3.org/TR/xmlschema-1/#no-xsi is very confusing. 

where does libxml get the schema lang schema/dtd? As a test I put some typos in my xsd file. libxml generated an error when I tried to validate the xsd file as expected?

what URL should I be using?

Do I need to make a special call to cause the libxml to use this other location?

My app will be running on a private network and not have access to www.w3.org, Do I need to copy a dtd or something to my local env?

thanks in advance

Andy



p.s. Bellow is a long email I was going to send before I got the surprise I mentioned above. There is a nice code example of how how to validate. Its much simpler than the other examples I have seen posted in the past


On Dec 13, 2011, at 7:19 AM, Piotr Sipika wrote:
> 
> I wrote a sample program (in C) to attempt to mimic what you have, and
> was able to successfully validate the instance against the schema you
> provided.
> 

Would you be willing to send my your sample C program? 

I must be missing a function call somewhere?  My XML/XSD files that do not use extensions validate so I think my basic code structure is correct. In your original post you mentioned "xmllint". I did not know about that tool. All of my files validate according to xmllint.I stepped through xmllint to see how it worked. Its very complicated. I must have missed something. Looking at the xmllint source I was able to simplify my code and get rid some some memory leaks.

Here is my simplified code listing based on the xmllint source

   const char *schemaFileNameStr = ...;
    
    // http://xmlsoft.org/html/libxml-xmlschemas.html#xmlSchemaNewParserCtxt
    xmlSchemaParserCtxtPtr ctxt = xmlSchemaNewParserCtxt(schemaFileNameStr);
    
     //http://xmlsoft.org/html/libxml-xmlschemas.html#xmlSchemaSetParserErrors
    xmlSchemaSetParserErrors(ctxt,
                             (xmlSchemaValidityErrorFunc) fprintf,
                             (xmlSchemaValidityWarningFunc) fprintf,
                             stderr);
    
	xmlSchemaPtr wxschemas = xmlSchemaParse(ctxt);
	if (wxschemas == NULL) {
	    NSLog(@"******* ERROR schema %@ failed to compile\n", xmlSchemaFilePath);
	    return ret; 
	}
	xmlSchemaFreeParserCtxt(ctx);

	for (all the xml files) {
   	// http://www.xmlsoft.org/html/libxml-xmlschemas.html#xmlSchemaNewValidCtxt
    	xmlSchemaValidCtxtPtr vctxt = xmlSchemaNewValidCtxt(wxschemas);
    
    	// http://xmlsoft.org/html/libxml-xmlschemas.html#xmlSchemaSetValidErrors
		xmlSchemaSetValidErrors(vctxt,
                            (xmlSchemaValidityErrorFunc) fprintf,
                            (xmlSchemaValidityWarningFunc) fprintf,
                            stderr);
    
    	// http://xmlsoft.org/html/libxml-xmlschemas.html#xmlSchemaValidateDoc
		int error = xmlSchemaValidateDoc(vctxt, doc);
		if (error == 0) {
        		ret = YES;
		} else if (error > 0) {
        		ret = NO;
	    		fprintf(stderr, "%s fails to validate\n", filename);
		} else {
        		ret = NO; // validation generated an internal error
		}
    
		xmlSchemaFreeValidCtxt(vctxt);
	}


<?xml version="1.0" encoding="UTF-8"?>
<zoo:cageRequest xmlns:zoo="http://www.example.org/Zoo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <animal xsi:type="zoo:Fish">
    <name>Blue Fin Tuna</name>
    <numberOfFins>4</numberOfFins>
  </animal>
</zoo:cageRequest>


element animal: Schemas validity error : Element 'animal', attribute 'xsi:type': The attribute 'xsi:type' is not allowed.
element numberOfFins: Schemas validity error : Element 'numberOfFins': This element is not expected.

DOCUMENT
version=1.0
standalone=true
  ELEMENT zoo:cageRequest
    namespace zoo href=http://www.example.org/Zoo
    namespace xsi href=http://www.w3.org/2001/XMLSchema-instanc...
    ELEMENT animal
      ATTRIBUTE xsi:type
        TEXT
          content=zoo:Fish
      ELEMENT name
        TEXT
          content=Blue Fin Tuna
      ELEMENT numberOfFins
        TEXT
          content=4

Received on Thursday, 15 December 2011 23:46:06 UTC