| | |
| |
|
| | 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'): |
| | |
| | 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): |
| | |
| | print("DEBUG:", text) |
| |
|
| |
|
| | def fixup(): |
| | for mainXSD in dictXSD: |
| | debugMsg("fixing '%s'..." % mainXSD) |
| | schemaDoc = None |
| | xpmainCtx = None |
| | |
| | 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() |
| | |
| | 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]: |
| | |
| | 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() |
| |
|
| | |
| | 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))) |
| |
|
| |
|