void RelaxNGSchema::parse_document(const Document* document) { if (!document) throw parse_error("RelaxNGSchema::parse_document(): document must not be 0."); // xmlRelaxNGNewDocParserCtxt() takes a copy of the xmlDoc. parse_context(xmlRelaxNGNewDocParserCtxt(const_cast<xmlDoc*>(document->cobj()))); }
/* * call-seq: * from_document(doc) * * Create a new RelaxNG schema from the Nokogiri::XML::Document +doc+ */ static VALUE from_document(VALUE klass, VALUE document) { xmlDocPtr doc; xmlRelaxNGParserCtxtPtr ctx; xmlRelaxNGPtr schema; VALUE errors; VALUE rb_schema; Data_Get_Struct(document, xmlDoc, doc); /* In case someone passes us a node. ugh. */ doc = doc->doc; ctx = xmlRelaxNGNewDocParserCtxt(doc); errors = rb_ary_new(); Nokogiri_install_error_catcher(errors); #ifdef HAVE_XMLRELAXNGSETPARSERSTRUCTUREDERRORS xmlRelaxNGSetParserStructuredErrors( ctx, Nokogiri_error_array_pusher, (void *)errors ); #endif schema = xmlRelaxNGParse(ctx); Nokogiri_remove_error_catcher(); if(NULL == schema) { xmlErrorPtr error = xmlGetLastError(); if(error) Nokogiri_error_raise(NULL, error); else rb_raise(rb_eRuntimeError, "Could not parse document"); return Qnil; } rb_schema = Data_Wrap_Struct(klass, 0, dealloc, schema); rb_iv_set(rb_schema, "@errors", errors); return rb_schema; }
/** * Parse elements from the configuration file. * */ ods_status parse_file_check(const char* cfgfile, const char* rngfile) { xmlDocPtr doc = NULL; xmlDocPtr rngdoc = NULL; xmlRelaxNGParserCtxtPtr rngpctx = NULL; xmlRelaxNGValidCtxtPtr rngctx = NULL; xmlRelaxNGPtr schema = NULL; if (!cfgfile || !rngfile) { ods_log_error("[%s] no cfgfile or rngfile", parser_str); return ODS_STATUS_ASSERT_ERR; } ods_log_assert(cfgfile); ods_log_assert(rngfile); ods_log_debug("[%s] check cfgfile %s with rngfile %s", parser_str, cfgfile, rngfile); /* Load XML document */ doc = xmlParseFile(cfgfile); if (doc == NULL) { ods_log_error("[%s] unable to read cfgfile %s", parser_str, cfgfile); return ODS_STATUS_XML_ERR; } /* Load rng document */ rngdoc = xmlParseFile(rngfile); if (rngdoc == NULL) { ods_log_error("[%s] unable to read rngfile %s", parser_str, rngfile); xmlFreeDoc(doc); return ODS_STATUS_XML_ERR; } /* Create an XML RelaxNGs parser context for the relax-ng document. */ rngpctx = xmlRelaxNGNewDocParserCtxt(rngdoc); if (rngpctx == NULL) { xmlFreeDoc(rngdoc); xmlFreeDoc(doc); ods_log_error("[%s] unable to create XML RelaxNGs parser context", parser_str); return ODS_STATUS_XML_ERR; } /* Parse a schema definition resource and * build an internal XML schema structure. */ schema = xmlRelaxNGParse(rngpctx); if (schema == NULL) { ods_log_error("[%s] unable to parse a schema definition resource", parser_str); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(rngdoc); xmlFreeDoc(doc); return ODS_STATUS_PARSE_ERR; } /* Create an XML RelaxNGs validation context. */ rngctx = xmlRelaxNGNewValidCtxt(schema); if (rngctx == NULL) { ods_log_error("[%s] unable to create RelaxNGs validation context", parser_str); xmlRelaxNGFree(schema); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(rngdoc); xmlFreeDoc(doc); return ODS_STATUS_RNG_ERR; } /* Validate a document tree in memory. */ /* better not check: if not correct, this will segfault. status = xmlRelaxNGValidateDoc(rngctx,doc); if (status != 0) { ods_log_error("[%s] cfgfile validation failed %s", parser_str, cfgfile); xmlRelaxNGFreeValidCtxt(rngctx); xmlRelaxNGFree(schema); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(rngdoc); xmlFreeDoc(doc); return ODS_STATUS_RNG_ERR; } */ xmlRelaxNGFreeValidCtxt(rngctx); xmlRelaxNGFree(schema); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(rngdoc); xmlFreeDoc(doc); return ODS_STATUS_OK; }
/* Check an XML file against its rng */ int check_rng(const char *filename, const char *rngfilename) { xmlDocPtr doc = NULL; xmlDocPtr rngdoc = NULL; xmlRelaxNGParserCtxtPtr rngpctx = NULL; xmlRelaxNGValidCtxtPtr rngctx = NULL; xmlRelaxNGPtr schema = NULL; if (verbose) { dual_log("DEBUG: About to check XML validity in %s\n", filename); } /* Load XML document */ doc = xmlParseFile(filename); if (doc == NULL) { dual_log("ERROR: unable to parse file \"%s\"\n", filename); /* Maybe the file doesn't exist? */ check_file(filename, "Configuration file"); return(1); } /* Load rng document */ rngdoc = xmlParseFile(rngfilename); if (rngdoc == NULL) { dual_log("ERROR: unable to parse file \"%s\"\n", rngfilename); /* Maybe the file doesn't exist? */ check_file(rngfilename, "RNG file"); xmlFreeDoc(doc); return(1); } /* Create an XML RelaxNGs parser context for the relax-ng document. */ rngpctx = xmlRelaxNGNewDocParserCtxt(rngdoc); if (rngpctx == NULL) { dual_log("ERROR: unable to create XML RelaxNGs parser context\n"); xmlFreeDoc(doc); xmlFreeDoc(rngdoc); return(1); } xmlRelaxNGSetParserErrors(rngpctx, (xmlRelaxNGValidityErrorFunc) fprintf, (xmlRelaxNGValidityWarningFunc) fprintf, stderr); /* parse a schema definition resource and build an internal XML Shema struture which can be used to validate instances. */ schema = xmlRelaxNGParse(rngpctx); if (schema == NULL) { dual_log("ERROR: unable to parse a schema definition resource\n"); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(doc); xmlFreeDoc(rngdoc); return(1); } /* Create an XML RelaxNGs validation context based on the given schema */ rngctx = xmlRelaxNGNewValidCtxt(schema); if (rngctx == NULL) { dual_log("ERROR: unable to create RelaxNGs validation context based on the schema\n"); xmlRelaxNGFree(schema); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(doc); xmlFreeDoc(rngdoc); return(1); } xmlRelaxNGSetValidErrors(rngctx, (xmlRelaxNGValidityErrorFunc) fprintf, (xmlRelaxNGValidityWarningFunc) fprintf, stderr); /* Validate a document tree in memory. */ if (xmlRelaxNGValidateDoc(rngctx,doc) != 0) { dual_log("ERROR: %s fails to validate\n", filename); xmlRelaxNGFreeValidCtxt(rngctx); xmlRelaxNGFree(schema); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(doc); xmlFreeDoc(rngdoc); return(1); } xmlRelaxNGFreeValidCtxt(rngctx); xmlRelaxNGFree(schema); xmlRelaxNGFreeParserCtxt(rngpctx); xmlFreeDoc(doc); xmlFreeDoc(rngdoc); return 0; }