lin
2025-07-30 fcd736bf35fd93b563e9bbf594f2aa7b62028cc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/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()