static int saveSBOLDocument(const char* filename) { int invalid = 0; if (!isValidSBOL(OUTPUT)) { invalid = 1; printf("WARNING: %s is not valid SBOL. Saving anyway.\n", filename); } int written = xmlSaveFile(filename, OUTPUT); return (int) invalid || written == -1; }
void readDocument(Document* destination, char* filename) { DESTINATION = destination; // parse safeXmlInitParser(); DOCUMENT = xmlParseFile(filename); if (!DOCUMENT) { printf("Error reading %s\n", filename); return; } // validate if (!isValidSBOL(DOCUMENT)) { printf("%s is not a valid SBOL document.\n", filename); return; } // create XPath context CONTEXT = xmlXPathNewContext(DOCUMENT); xmlXPathRegisterNs(CONTEXT, (const xmlChar*)NSPREFIX_SBOL, (const xmlChar*)NSURL_SBOL); xmlXPathRegisterNs(CONTEXT, (const xmlChar*)NSPREFIX_RDF, (const xmlChar*)NSURL_RDF); #define GLOBAL_XPATH BAD_CAST "//" NSPREFIX_SBOL ":" // create all the SBOLObjects processNodes(readDNASequenceContent, GLOBAL_XPATH NODENAME_DNASEQUENCE); processNodes(readSequenceAnnotationContent, GLOBAL_XPATH NODENAME_SEQUENCEANNOTATION); processNodes(readDNAComponentContent, GLOBAL_XPATH NODENAME_DNACOMPONENT); processNodes(readCollectionContent, GLOBAL_XPATH NODENAME_COLLECTION); // link them together with pointers processNodes(readSequenceAnnotationReferences, GLOBAL_XPATH NODENAME_SEQUENCEANNOTATION); processNodes(readDNAComponentReferences, GLOBAL_XPATH NODENAME_DNACOMPONENT); processNodes(readCollectionReferences, GLOBAL_XPATH NODENAME_COLLECTION); #undef GLOBAL_XPATH // clean up xmlXPathFreeContext(CONTEXT); xmlFreeDoc(DOCUMENT); DESTINATION = NULL; xmlCleanupParser(); }