Search code examples
jsonxmlvalidationxsdjsonix

JSONIX how to have a strong XML Validation


I just tried to run the JSONIX sample purchase order. I did it like it was mentioned on the Highscore WebSite. What makes me wonder was this sample bases on the use of a XSD, the validation of the incoming XML is used for elements with child nodes but not for simple tags.

This will show an error:

 ... <item_will_cause_error partNum="926-AA">
       <productName>Baby Monitor</productName>
       <quantity>1</quantity>
       <USPrice>39.98</USPrice>
       <shipDate>1999-05-21</shipDate>
 ... </item_will_cause_error>

This not:

 ... <item partNum="926-AA">
       <productName>Baby Monitor</productName>
       <quantity_will_cause_error>1</quantity_will_cause_error>
       <USPrice>39.98</USPrice>
       <shipDate>1999-05-21</shipDate>
 ... </item>

So, is it possible to switch on a strong validation, because <quantity_will_cause_error>is not a valid element.

Kind regards

Markus


Solution

  • now I use this

     var Jsonix = require('jsonix').Jsonix;
     //Include or require PO.js so that PO variable is available
     //For instance, in node.js:
     var PO = require('./mappings/PO').PO;
    
        //First we construct a Jsonix context - a factory for unmarshaller     
        //(parser)
        //and marshaller (serializer)
        var context = new Jsonix.Context([ PO ]);
    
        //Then we create a unmarshaller
        var unmarshaller = context.createUnmarshaller();
    
        //Unmarshal an object from the XML retrieved from the URL
    
        var fs = require('fs');
        var Ajv = require('ajv');
    
        var XMLSchemaJsonSchema =    
       JSON.parse(fs.readFileSync(
       './node_modules/jsonix/jsonschemas/w3c/2001/XMLSchema.jsonschema')
       .toString());
       var JsonixJsonSchema = JSON.parse(fs.readFileSync(
       './node_modules/jsonix/jsonschemas/jsonix/Jsonix.jsonschema')
       .toString());
        var POJsonSchema =         JSON.parse(fs.readFileSync(
       './mappings/PO.jsonschema').toString());
    
        var ajv = new Ajv();
        ajv.addSchema(XMLSchemaJsonSchema, 
       'http://www.jsonix.org/jsonschemas/w3c/2001/XMLSchema.jsonschema');
        ajv.addSchema(JsonixJsonSchema, 
       'http://www.jsonix.org/jsonschemas/jsonix/Jsonix.jsonschema');
        var validate = ajv.compile(POJsonSchema);
    
    
    
        unmarshaller.unmarshalFile('./po.xml',
        //This callback function will be provided
        //with the result of the unmarshalling
        function (unmarshalled) {
    
            var po_ = unmarshalled;
    
            var valid = validate(po_);
            if (!valid) {
                console.log('Validation failed.');
                console.log('Validation errors:');
                console.log(validate.errors);
            }
    
    
        });
    

    The Result looks like this:

        Validation failed.
        Validation errors:
        [ { keyword: 'type',
            dataPath: '.value.items.item[1].shipDate.timezone',
            schemaPath: '#/definitions/integer/type',
            params: { type: 'integer,null' },
            message: 'should be integer,null' },
          { keyword: 'type',
            dataPath: '.value.items.item[1].shipDate',
            schemaPath: '#/anyOf/1/type',
            params: { type: 'null' },
            message: 'should be null' },
          { keyword: 'anyOf',
            dataPath: '.value.items.item[1].shipDate',
            schemaPath: '#/anyOf',
            params: {},
            message: 'should match some schema in anyOf' },
          { keyword: 'enum',
            dataPath: '.name.localPart',
            schemaPath: '#/anyOf/1/properties/name/allOf/1/properties/localPart/enum',
            params: { allowedValues: [Object] },
            message: 'should be equal to one of the allowed values' },
          { keyword: 'anyOf',
            dataPath: '',
            schemaPath: '#/anyOf',
            params: {},
            message: 'should match some schema in anyOf' } ]
    

    But this make me again wonder: dataPath: '', an error on the root ???