Hi,

I am working on patch adding xmlvalidate() functionality. LibXML 2.7.7 improved 
DTD, XSD, Relax-NG validation, so using that. I have idea of creating system 
table for holding DTDs, XSDs, Relax-NGs (similar as on ORACLE). 

Is that good idea? If so, how to implement that table? pg_attribute and 
pg_class had changed guite from PostgresSQL 8.0.

Including code, work on progress.

bool 
validate_xml_with_xsd(const char* xsd, const char* xml)
{

        bool result = false;
        xmlSchemaPtr schema = NULL;         // pointer to schema
        xmlLineNumbersDefault(1);           // set line numbering in xml if any 
errors occurated

//// create xsd 
        xmlSchemaParserCtxtPtr ctxt;
        ctxt = xmlSchemaNewMemParserCtxt((const char*)xsd, strlen(xsd));
        xmlSchemaSetParserErrors(ctxt,
                (xmlSchemaValidityErrorFunc) fprintf,
                (xmlSchemaValidityWarningFunc) fprintf,
                        stderr);
        schema = xmlSchemaParse(ctxt);
        xmlSchemaFreeParserCtxt(ctxt);

        if (schema == NULL)
        {
                elog(ERROR, "ERROR with DTD");
        }

/// crate XML 
        xmlDocPtr doc;                  

        doc = xmlReadDoc((char *)xml 
,"http://www.w3.org/2001/XMLSchema",NULL,0);       

        if (doc == NULL)
        {
            elog(ERROR, "nepodarilo se nacist xml soubor ze vstupu");
        } else
        {
            xmlSchemaValidCtxtPtr ctxt;
            int ret;

            ctxt = xmlSchemaNewValidCtxt(schema);
            xmlSchemaSetValidErrors(ctxt,
                    (xmlSchemaValidityErrorFunc) fprintf,
                    (xmlSchemaValidityWarningFunc) fprintf,
                    stderr);
            ret = xmlSchemaValidateDoc(ctxt, doc);
            if (ret == 0)
            {
                result = true;
                elog(WARNING, "validation SUCCED");
            } else
            if (ret > 0) {
                result = false;
                elog(WARNING, "not validated");
            } else
            {
                result = false;
                elog(WARNING, "validation failed with internal error");
            }

            xmlSchemaFreeValidCtxt(ctxt);
            xmlFreeDoc(doc);
        }

        if (schema != NULL)
        { // free
                xmlSchemaFree(schema);
        }

        return result;
}







-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to