[Opendnssec-develop] libxml2 xsd:durations

John Dickinson jad at jadickinson.co.uk
Tue Apr 14 16:35:07 UTC 2009

Before I write a function to do it myself, does anyone know how to  
deal with xsd:durations in C (convert them to seconds). I hoped that  
libxml2 would do it for me but I can not find the function :)

Also for anyone else who needs to read, validate and parse with xpath  
the opendnssec xml files using libxml2 here is some example code that  
once much improved will end up in the enforcer.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <libxml/tree.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/relaxng.h>

int main()
     xmlDocPtr doc;
     xmlDocPtr rngdoc;
     xmlXPathContextPtr xpathCtx;
     xmlXPathObjectPtr xpathObj;
     xmlRelaxNGParserCtxtPtr rngpctx;
     xmlRelaxNGValidCtxtPtr rngctx;
     xmlRelaxNGPtr schema;
     xmlChar *xexpr;
     xexpr = "//Configuration/Enforcer/KeygenInterval";
     int status;
     char* filename = "/tmp/conf.xml";
     char* rngfilename = "/tmp/conf.rng";

     /* Load XML document */
     doc = xmlParseFile(filename);
     if (doc == NULL) {
   	  fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename);

     /* Load rng document */
     rngdoc = xmlParseFile(rngfilename);
     if (rngdoc == NULL) {
   	  fprintf(stderr, "Error: unable to parse file \"%s\"\n",  

     /* Create an XML RelaxNGs parser context for the relax-ng  
document. */
     rngpctx = xmlRelaxNGNewDocParserCtxt(rngdoc);

     /* parse a schema definition resource and build an internal XML  
Shema struture which can be used to validate instances. */
     schema = xmlRelaxNGParse(rngpctx);

     /* Create an XML RelaxNGs validation context based on the given  
schema */
     rngctx = xmlRelaxNGNewValidCtxt(schema);

     /* Validate a document tree in memory. */
     status = xmlRelaxNGValidateDoc(rngctx,doc);
     if (status != 0) {
       fprintf(stderr, "Error validating file \"%s\"\n", filename);

     /* Now parse a value out of the conf */
     /* lets try and get the keygeninterval */

     /* Create xpath evaluation context */
     xpathCtx = xmlXPathNewContext(doc);
     if(xpathCtx == NULL) {
         fprintf(stderr,"Error: unable to create new XPath context\n");

     /* Evaluate xpath expression */
     xpathObj = xmlXPathEvalExpression(xexpr, xpathCtx);
     if(xpathObj == NULL) {
         fprintf(stderr,"Error: unable to evaluate xpath expression\n");
     printf("keygeninterval is %s\n", xmlXPathCastToString(xpathObj));

     /* Cleanup */
     /* some other frees are needed */


John Dickinson

I am riding from Lands end to John O'Groats to raise money for  
Parkinson's Disease Research. Please sponsor me here http://justgiving.com/pedalforparkinsons2009

More information about the Opendnssec-develop mailing list