You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.3 KiB
100 lines
3.3 KiB
4 months ago
|
#!/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()
|
||
|
|