1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*7c568831SAndroid Build Coastguard Worker 3*7c568831SAndroid Build Coastguard Workerimport sys, os 4*7c568831SAndroid Build Coastguard Workerimport libxml2 5*7c568831SAndroid Build Coastguard Worker 6*7c568831SAndroid Build Coastguard Worker 7*7c568831SAndroid Build Coastguard Workerlibxml2.debugMemory(1) 8*7c568831SAndroid Build Coastguard WorkerbaseDir = os.path.join('msxsdtest', 'Particles') 9*7c568831SAndroid Build Coastguard Workerfilenames = os.listdir(baseDir) 10*7c568831SAndroid Build Coastguard WorkermainXSD = str() 11*7c568831SAndroid Build Coastguard Workersignature = str() 12*7c568831SAndroid Build Coastguard WorkerdictXSD = dict() 13*7c568831SAndroid Build Coastguard Worker 14*7c568831SAndroid Build Coastguard Workerdef gatherFiles(): 15*7c568831SAndroid Build Coastguard Worker for file in filenames: 16*7c568831SAndroid Build Coastguard Worker if (file[-5] in ["a", "b", "c"]) and (file[-3:] == 'xsd'): 17*7c568831SAndroid Build Coastguard Worker # newfilename = string.replace(filename, ' ', '_') 18*7c568831SAndroid Build Coastguard Worker signature = file[:-5] 19*7c568831SAndroid Build Coastguard Worker mainXSD = signature + ".xsd" 20*7c568831SAndroid Build Coastguard Worker imports = [] 21*7c568831SAndroid Build Coastguard Worker for sub in filenames: 22*7c568831SAndroid Build Coastguard Worker if (mainXSD != sub) and (sub[-3:] == 'xsd') and sub.startswith(signature): 23*7c568831SAndroid Build Coastguard Worker imports.append(sub) 24*7c568831SAndroid Build Coastguard Worker if len(imports) != 0: 25*7c568831SAndroid Build Coastguard Worker dictXSD[mainXSD] = imports 26*7c568831SAndroid Build Coastguard Worker 27*7c568831SAndroid Build Coastguard Workerdef debugMsg(text): 28*7c568831SAndroid Build Coastguard Worker #pass 29*7c568831SAndroid Build Coastguard Worker print("DEBUG:", text) 30*7c568831SAndroid Build Coastguard Worker 31*7c568831SAndroid Build Coastguard Worker 32*7c568831SAndroid Build Coastguard Workerdef fixup(): 33*7c568831SAndroid Build Coastguard Worker for mainXSD in dictXSD: 34*7c568831SAndroid Build Coastguard Worker debugMsg("fixing '%s'..." % mainXSD) 35*7c568831SAndroid Build Coastguard Worker schemaDoc = None 36*7c568831SAndroid Build Coastguard Worker xpmainCtx = None 37*7c568831SAndroid Build Coastguard Worker # Load the schema document. 38*7c568831SAndroid Build Coastguard Worker schemaFile = os.path.join(baseDir, mainXSD) 39*7c568831SAndroid Build Coastguard Worker schemaDoc = libxml2.parseFile(schemaFile) 40*7c568831SAndroid Build Coastguard Worker if (schemaDoc is None): 41*7c568831SAndroid Build Coastguard Worker print("ERROR: doc '%s' not found" % mainXSD) 42*7c568831SAndroid Build Coastguard Worker sys.exit(1) 43*7c568831SAndroid Build Coastguard Worker try: 44*7c568831SAndroid Build Coastguard Worker xpmainCtx = schemaDoc.xpathNewContext() 45*7c568831SAndroid Build Coastguard Worker xpmainCtx.xpathRegisterNs("xs", "http://www.w3.org/2001/XMLSchema") 46*7c568831SAndroid Build Coastguard Worker xpres = xpmainCtx.xpathEval("/xs:schema") 47*7c568831SAndroid Build Coastguard Worker if len(xpres) == 0: 48*7c568831SAndroid Build Coastguard Worker print("ERROR: doc '%s' has no <schema> element" % mainXSD) 49*7c568831SAndroid Build Coastguard Worker sys.exit(1) 50*7c568831SAndroid Build Coastguard Worker schemaElem = xpres[0] 51*7c568831SAndroid Build Coastguard Worker schemaNs = schemaElem.ns() 52*7c568831SAndroid Build Coastguard Worker # Select all <import>s. 53*7c568831SAndroid Build Coastguard Worker xpres = xpmainCtx.xpathEval("/xs:schema/xs:import") 54*7c568831SAndroid Build Coastguard Worker if len(xpres) != 0: 55*7c568831SAndroid Build Coastguard Worker for elem in xpres: 56*7c568831SAndroid Build Coastguard Worker loc = elem.noNsProp("schemaLocation") 57*7c568831SAndroid Build Coastguard Worker if (loc is not None): 58*7c568831SAndroid Build Coastguard Worker debugMsg(" imports '%s'" % loc) 59*7c568831SAndroid Build Coastguard Worker if loc in dictXSD[mainXSD]: 60*7c568831SAndroid Build Coastguard Worker dictXSD[mainXSD].remove(loc) 61*7c568831SAndroid Build Coastguard Worker for loc in dictXSD[mainXSD]: 62*7c568831SAndroid Build Coastguard Worker # Read out the targetNamespace. 63*7c568831SAndroid Build Coastguard Worker impTargetNs = None 64*7c568831SAndroid Build Coastguard Worker impFile = os.path.join(baseDir, loc) 65*7c568831SAndroid Build Coastguard Worker impDoc = libxml2.parseFile(impFile) 66*7c568831SAndroid Build Coastguard Worker try: 67*7c568831SAndroid Build Coastguard Worker xpimpCtx = impDoc.xpathNewContext() 68*7c568831SAndroid Build Coastguard Worker try: 69*7c568831SAndroid Build Coastguard Worker xpimpCtx.setContextDoc(impDoc) 70*7c568831SAndroid Build Coastguard Worker xpimpCtx.xpathRegisterNs("xs", "http://www.w3.org/2001/XMLSchema") 71*7c568831SAndroid Build Coastguard Worker xpres = xpimpCtx.xpathEval("/xs:schema") 72*7c568831SAndroid Build Coastguard Worker impTargetNs = xpres[0].noNsProp("targetNamespace") 73*7c568831SAndroid Build Coastguard Worker finally: 74*7c568831SAndroid Build Coastguard Worker xpimpCtx.xpathFreeContext() 75*7c568831SAndroid Build Coastguard Worker finally: 76*7c568831SAndroid Build Coastguard Worker impDoc.freeDoc() 77*7c568831SAndroid Build Coastguard Worker 78*7c568831SAndroid Build Coastguard Worker # Add the <import>. 79*7c568831SAndroid Build Coastguard Worker debugMsg(" adding <import namespace='%s' schemaLocation='%s'/>" % (impTargetNs, loc)) 80*7c568831SAndroid Build Coastguard Worker newElem = schemaDoc.newDocNode(schemaNs, "import", None) 81*7c568831SAndroid Build Coastguard Worker if (impTargetNs is not None): 82*7c568831SAndroid Build Coastguard Worker newElem.newProp("namespace", impTargetNs) 83*7c568831SAndroid Build Coastguard Worker newElem.newProp("schemaLocation", loc) 84*7c568831SAndroid Build Coastguard Worker if schemaElem.children is not None: 85*7c568831SAndroid Build Coastguard Worker schemaElem.children.addPrevSibling(newElem) 86*7c568831SAndroid Build Coastguard Worker schemaDoc.saveFile(schemaFile) 87*7c568831SAndroid Build Coastguard Worker finally: 88*7c568831SAndroid Build Coastguard Worker xpmainCtx.xpathFreeContext() 89*7c568831SAndroid Build Coastguard Worker schemaDoc.freeDoc() 90*7c568831SAndroid Build Coastguard Worker 91*7c568831SAndroid Build Coastguard Workertry: 92*7c568831SAndroid Build Coastguard Worker gatherFiles() 93*7c568831SAndroid Build Coastguard Worker fixup() 94*7c568831SAndroid Build Coastguard Workerfinally: 95*7c568831SAndroid Build Coastguard Worker libxml2.cleanupParser() 96*7c568831SAndroid Build Coastguard Worker if libxml2.debugMemory(1) != 0: 97*7c568831SAndroid Build Coastguard Worker print("Memory leak %d bytes" % (libxml2.debugMemory(1))) 98*7c568831SAndroid Build Coastguard Worker 99