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