#!/usr/bin/python -u import sys, os import libxml2 libxml2.debugMemory(1) baseDir = os.path.join('msxsdtest', 'Particles') filenames = os.listdir(baseDir) mainXSD = str() signature = str() dictXSD = dict() def gatherFiles(): for file in filenames: if (file[-5] in ["a", "b", "c"]) and (file[-3:] == 'xsd'): # newfilename = string.replace(filename, ' ', '_') signature = file[:-5] mainXSD = signature + ".xsd" imports = [] for sub in filenames: if (mainXSD != sub) and (sub[-3:] == 'xsd') and sub.startswith(signature): imports.append(sub) if len(imports) != 0: dictXSD[mainXSD] = imports def debugMsg(text): #pass print "DEBUG:", text def fixup(): for mainXSD in dictXSD: debugMsg("fixing '%s'..." % mainXSD) schemaDoc = None xpmainCtx = None # Load the schema document. schemaFile = os.path.join(baseDir, mainXSD) schemaDoc = libxml2.parseFile(schemaFile) if (schemaDoc is None): print "ERROR: doc '%s' not found" % mainXSD sys.exit(1) try: xpmainCtx = schemaDoc.xpathNewContext() xpmainCtx.xpathRegisterNs("xs", "http://www.w3.org/2001/XMLSchema"); xpres = xpmainCtx.xpathEval("/xs:schema") if len(xpres) == 0: print "ERROR: doc '%s' has no <schema> element" % mainXSD sys.exit(1) schemaElem = xpres[0] schemaNs = schemaElem.ns() # Select all <import>s. xpres = xpmainCtx.xpathEval("/xs:schema/xs:import") if len(xpres) != 0: for elem in xpres: loc = elem.noNsProp("schemaLocation") if (loc is not None): debugMsg(" imports '%s'" % loc) if loc in dictXSD[mainXSD]: dictXSD[mainXSD].remove(loc) for loc in dictXSD[mainXSD]: # Read out the targetNamespace. impTargetNs = None impFile = os.path.join(baseDir, loc) impDoc = libxml2.parseFile(impFile) try: xpimpCtx = impDoc.xpathNewContext() try: xpimpCtx.setContextDoc(impDoc) xpimpCtx.xpathRegisterNs("xs", "http://www.w3.org/2001/XMLSchema"); xpres = xpimpCtx.xpathEval("/xs:schema") impTargetNs = xpres[0].noNsProp("targetNamespace") finally: xpimpCtx.xpathFreeContext() finally: impDoc.freeDoc() # Add the <import>. debugMsg(" adding <import namespace='%s' schemaLocation='%s'/>" % (impTargetNs, loc)) newElem = schemaDoc.newDocNode(schemaNs, "import", None) if (impTargetNs is not None): newElem.newProp("namespace", impTargetNs) newElem.newProp("schemaLocation", loc) if schemaElem.children is not None: schemaElem.children.addPrevSibling(newElem) schemaDoc.saveFile(schemaFile) finally: xpmainCtx.xpathFreeContext() schemaDoc.freeDoc() try: gatherFiles() fixup() finally: libxml2.cleanupParser() if libxml2.debugMemory(1) != 0: print "Memory leak %d bytes" % (libxml2.debugMemory(1)) libxml2.dumpMemory()