JSONIX 如何拥有强大的 XML 验证

JSONIX how to have a strong XML Validation

我刚刚尝试 运行 JSONIX 示例采购订单。 我做的就像 Highscore 网站上提到的那样。 让我想知道的是这个示例基于 XSD 的使用,传入 XML 的验证用于具有子节点的元素而不是简单的标签。

这将显示错误:

 ... <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>

这不是:

 ... <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>

所以,是否可以打开强验证,因为 <quantity_will_cause_error> 不是有效元素。

亲切的问候

马库斯

现在我用这个

 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);
        }


    });

结果如下所示:

    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' } ]

但这让我又想知道: dataPath: '', root 上的错误 ???