[xml] libxml2 does xmlSchemaValidateDoc() support xml schema extensions?



Hi

I am using libxml2. I use xmlSchemaValidateDoc() to make sure my xml is valid. Recently we started using Extension to define new complexTypes.

The description for extensions can be found at http://www.w3.org/TR/xmlschema-0/#DerivExt  

These instance do not validate using libxml2. I am able to validate these instance using java version "1.6.0_29"


Attached is my test Zoo.xsd, and the instance I am trying to validate

Attachment: ZooRequest.xsd
Description: Binary data



    <complexType name="Animal">
        <sequence>
            <element name="name" type="string" />
        </sequence>
    </complexType>

    <complexType name="Fish">
        <complexContent>
            <extension base="zoo:Animal">
                <sequence>
                    <element name="numberOfFins" type="integer" />
                </sequence>
            </extension>
        </complexContent>
    </complexType>

My xml instance is 

<?xml version="1.0" encoding="UTF-8"?>
  <animal xsi:type="zoo:Fish">
    <name>Blue Fin Tuna</name>
    <numberOfFins>4</numberOfFins>
  </animal>
</zoo:cageRequest>

xmlSchemaValidateDoc() generates the following output
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.

the error returned is  1871 for instance

xmlDebugDumpDocument() produces

DOCUMENT
version=1.0
standalone=true
  ELEMENT zoo:cageRequest
    namespace zoo href="">
    namespace xsi href="">
    ELEMENT animal
      ATTRIBUTE xsi:type
        TEXT
          content=zoo:Fish
      ELEMENT name
        TEXT
          content=Blue Fin Tuna
      ELEMENT numberOfFins
        TEXT
          content=4
(gdb) 

Do I need to tweak my validation code ? 


(this is an ObjC listing)

    

    

    const char *schemaFileNameStr = [xmlSchemaFilePath cStringUsingEncoding: NSASCIIStringEncoding];

    

    // second arg, null, is document encoding
    // XML_PARSE_NONET option means "Forbid network access"
    xmlDocPtr schemaDoc = xmlReadFile(schemaFileNameStr, NULL, XML_PARSE_NONET);
    NSString *errorMsgRoot = @"**** ERROR: POSXMLSchemaValidator.m createAndAddValidatorFor:, ";
    if (schemaDoc == NULL) {
        /* the schema cannot be loaded or is not well-formed */
        NSLog(@"%@ the schema: %s can not be loaded or is not well-formed", errorMsgRoot, schemaFileNameStr);
        return ret;
    }

    

    xmlSchemaParserCtxtPtr parserCtxt = xmlSchemaNewDocParserCtxt(schemaDoc);
    if (parserCtxt == NULL) {
        /* unable to create a parser context for the schema */
        xmlFreeDoc(schemaDoc);
        NSLog(@"%@ unable to create a parser context for schema %s", errorMsgRoot, schemaFileNameStr);
        return ret;
    }

    

    xmlSchemaPtr schema = xmlSchemaParse(parserCtxt);
    if (schema == NULL) {
        /* the schema itself is not valid */
        xmlSchemaFreeParserCtxt(parserCtxt);
        xmlFreeDoc(schemaDoc);
        NSLog(@"%@ the schema %s is not valid", errorMsgRoot, schemaFileNameStr);
        return ret;
    }

    

    xmlSchemaValidCtxtPtr validCtxt = xmlSchemaNewValidCtxt(schema);
    if (validCtxt == NULL) {
        /* unable to create a validation context for the schema */
        xmlSchemaFree(schema);
        xmlSchemaFreeParserCtxt(parserCtxt);
        xmlFreeDoc(schemaDoc);
        NSLog(@"%@ unable to validation context for schema %s", errorMsgRoot, schemaFileNameStr);
        return ret; 
    }

    

    //xmlSchemaFree(schema); causes crash when we try to use validCtxt
    xmlSchemaFreeParserCtxt(parserCtxt);
    xmlFreeDoc(schemaDoc);

    

    int error = xmlSchemaValidateDoc(validCtxt.validCtxt, doc);             
    if (error == 0) {
        NSLog(@"document is a valid instance of %@", schemaFileName);
        ret = YES;
    } 

    


Is this a bug?

thanks in advance

Andy



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]