valid_status validate_doc(void *pool, xmlSchemaPtr schema, xmlDocPtr doc, qhead *err_list) { xmlSchemaValidCtxtPtr svctx; /* schema validator context */ valerr_ctx ctx; /* context used for validator's error hook */ int rc; /* return code from xmllib's validator */ svctx = xmlSchemaNewValidCtxt(schema); if (svctx == NULL) { return VAL_EINTERNAL; } /* initialize error hook's context */ ctx.err_list = err_list; ctx.doc = doc; ctx.pool = pool; xmlSchemaSetValidStructuredErrors(svctx, validerr_callback, &ctx); /* validate request against schema */ rc = xmlSchemaValidateDoc(svctx, doc); if (rc < 0) { /* -1 is validator's internal error */ xmlSchemaFreeValidCtxt(svctx); return VAL_EINTERNAL; } if (rc > 0) { /* the doc does not validate */ xmlSchemaFreeValidCtxt(svctx); return VAL_NOT_VALID; } xmlSchemaFreeValidCtxt(svctx); return VAL_OK; }
/* * call-seq: * validate_file(filename) * * Validate a file against this Schema. */ static VALUE validate_file(VALUE self, VALUE rb_filename) { xmlSchemaPtr schema; const char *filename ; Data_Get_Struct(self, xmlSchema, schema); filename = (const char*)StringValuePtr(rb_filename) ; VALUE errors = rb_ary_new(); xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema); if(NULL == valid_ctxt) { // we have a problem rb_raise(rb_eRuntimeError, "Could not create a validation context"); } #ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS xmlSchemaSetValidStructuredErrors( valid_ctxt, Nokogiri_error_array_pusher, (void *)errors ); #endif xmlSchemaValidateFile(valid_ctxt, filename, 0); xmlSchemaFreeValidCtxt(valid_ctxt); return errors; }
/* * call-seq: * validate_document(document) * * Validate a Nokogiri::XML::Document against this Schema. */ static VALUE validate_document(VALUE self, VALUE document) { xmlDocPtr doc; xmlSchemaPtr schema; Data_Get_Struct(self, xmlSchema, schema); Data_Get_Struct(document, xmlDoc, doc); VALUE errors = rb_ary_new(); xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema); if(NULL == valid_ctxt) { // we have a problem rb_raise(rb_eRuntimeError, "Could not create a validation context"); } #ifdef HAVE_XMLSCHEMASETVALIDSTRUCTUREDERRORS xmlSchemaSetValidStructuredErrors( valid_ctxt, Nokogiri_error_array_pusher, (void *)errors ); #endif xmlSchemaValidateDoc(valid_ctxt, doc); xmlSchemaFreeValidCtxt(valid_ctxt); return errors; }
HRESULT SchemaCache_validate_tree(IXMLDOMSchemaCollection2* iface, xmlNodePtr tree) { schema_cache* This = impl_from_IXMLDOMSchemaCollection2(iface); cache_entry* entry; xmlChar const* ns = NULL; TRACE("(%p, %p)\n", This, tree); if (!tree) return E_POINTER; if ((xmlNodePtr)tree->doc == tree) { xmlNodePtr root = xmlDocGetRootElement(tree->doc); if (root && root->ns) ns = root->ns->href; } else if (tree->ns) { ns = tree->ns->href; } entry = xmlHashLookup(This->cache, ns); /* TODO: if the ns is not in the cache, and it's a URL, * do we try to load from that? */ if (entry) { if (entry->type == SCHEMA_TYPE_XDR) { FIXME("partial stub: XDR schema support not implemented\n"); return S_OK; } else if (entry->type == SCHEMA_TYPE_XSD) { xmlSchemaValidCtxtPtr svctx; int err; /* TODO: if validateOnLoad property is false, * we probably need to validate the schema here. */ svctx = xmlSchemaNewValidCtxt(entry->schema); xmlSchemaSetValidErrors(svctx, validate_error, validate_warning, NULL); #ifdef HAVE_XMLSCHEMASSETVALIDSTRUCTUREDERRORS xmlSchemaSetValidStructuredErrors(svctx, validate_serror, NULL); #endif if ((xmlNodePtr)tree->doc == tree) err = xmlSchemaValidateDoc(svctx, (xmlDocPtr)tree); else err = xmlSchemaValidateOneElement(svctx, tree); xmlSchemaFreeValidCtxt(svctx); return err? S_FALSE : S_OK; } } return E_FAIL; }
static inline HRESULT Schema_validate_tree(xmlSchemaPtr schema, xmlNodePtr tree) { xmlSchemaValidCtxtPtr svctx; int err; TRACE("(%p, %p)\n", schema, tree); /* TODO: if validateOnLoad property is false, * we probably need to validate the schema here. */ svctx = xmlSchemaNewValidCtxt(schema); xmlSchemaSetValidErrors(svctx, validate_error, validate_warning, NULL); #ifdef HAVE_XMLSCHEMASSETVALIDSTRUCTUREDERRORS xmlSchemaSetValidStructuredErrors(svctx, validate_serror, NULL); #endif if (tree->type == XML_DOCUMENT_NODE) err = xmlSchemaValidateDoc(svctx, (xmlDocPtr)tree); else err = xmlSchemaValidateOneElement(svctx, tree); xmlSchemaFreeValidCtxt(svctx); return err? S_FALSE : S_OK; }
static inline int oscap_validate_xml(struct oscap_source *source, const char *schemafile, xml_reporter reporter, void *arg) { int result = -1; xmlSchemaParserCtxtPtr parser_ctxt = NULL; xmlSchemaPtr schema = NULL; xmlSchemaValidCtxtPtr ctxt = NULL; xmlDocPtr doc = NULL; struct ctxt context = { reporter, arg, (void*) oscap_source_readable_origin(source)}; if (schemafile == NULL) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "'schemafile' == NULL"); return -1; } char * schemapath = oscap_sprintf("%s%s%s", oscap_path_to_schemas(), "/", schemafile); if (access(schemapath, R_OK)) { oscap_seterr(OSCAP_EFAMILY_OSCAP, "Schema file '%s' not found in path '%s' when trying to validate '%s'", schemafile, oscap_path_to_schemas(), oscap_source_readable_origin(source)); goto cleanup; } parser_ctxt = xmlSchemaNewParserCtxt(schemapath); if (parser_ctxt == NULL) { oscap_seterr(OSCAP_EFAMILY_XML, "Could not create parser context for validation"); goto cleanup; } xmlSchemaSetParserStructuredErrors(parser_ctxt, oscap_xml_validity_handler, &context); schema = xmlSchemaParse(parser_ctxt); if (schema == NULL) { oscap_seterr(OSCAP_EFAMILY_XML, "Could not parse XML schema"); goto cleanup; } ctxt = xmlSchemaNewValidCtxt(schema); if (ctxt == NULL) { oscap_seterr(OSCAP_EFAMILY_XML, "Could not create validation context"); goto cleanup; } xmlSchemaSetValidStructuredErrors(ctxt, oscap_xml_validity_handler, &context); doc = oscap_source_get_xmlDoc(source); if (!doc) goto cleanup; result = xmlSchemaValidateDoc(ctxt, doc); /* * xmlSchemaValidateFile() returns "-1" if document is not well formed * thefore we ignore libxml internal errors here and map return code to * either pass or fail. */ if (result != 0) result = 1; /* This would be nicer * if (result == -1) * oscap_setxmlerr(xmlGetLastError()); */ cleanup: if (ctxt) xmlSchemaFreeValidCtxt(ctxt); if (schema) xmlSchemaFree(schema); if (parser_ctxt) xmlSchemaFreeParserCtxt(parser_ctxt); oscap_free(schemapath); return result; }