xsd文件合并
在用SDO的 HelperContext加载xsd时,发现同样的namespace,它只加载一次(应该算bug吧?!),也就是说如果有相同的namespace的话,第二次加载的xsd里的类型将找不到,现在解决的方式是合并所有的namespace相同的xsd,成为一个新的xsd,然后让HelperContext加载,这样就避免了上述问题
?
/** * 将相同namespace的xsd合并成一个xsd并以namespace为key装入Map * @param xsdMap * @param type */private static void setXSDString(Map xsdMap,String[] type){for(int i=0;i<type.length;i++){String xsd = type[i].trim();String nameSpace = getNameSpaceFromSchema(xsd);//1、替换xsd文件前缀String srcXSDPrifix = getXSDPrifix(xsd);if(!"".equals(srcXSDPrifix))xsd = xsd.replaceAll(srcXSDPrifix, "xsd");else{xsd = xsd.replaceAll("<", "<xsd:");xsd = xsd.replaceAll("<xsd:/", "</xsd:");for(Iterator it =getXSDType().iterator();it.hasNext();){String xsdtype = it.next().toString();String typeStr = "type=\""+xsdtype+"\"";String destStr = "type=\"xsd:"+xsdtype+"\"";if(xsd.indexOf(typeStr)!=-1)xsd = xsd.replaceAll(typeStr, destStr);}}//2、替换所有的namespace前缀List srcTNSPrifix = getTNSPrifix(xsd);for(Iterator it=srcTNSPrifix.iterator();it.hasNext();){String temp = it.next().toString();if(!"".equals(temp)) xsd = xsd.replaceAll(it.next().toString()+":", "");}//3、生成xsd内容(除去头和尾)String srcContent = xsd.substring(xsd.indexOf(">")+1,xsd.indexOf("</xsd:schema>"));//如果map里不存在同样namespace的xsdif(!xsdMap.containsKey(nameSpace))xsdMap.put(nameSpace, srcContent);else{//将现有的xsd文件内容合并到之前的xsd文件String destContent = xsdMap.get(nameSpace).toString().trim();String resultXSD = destContent+srcContent;xsdMap.put(nameSpace, resultXSD);}}}/** * 由schema获取其namespace * @param schema * @return */private static String getNameSpaceFromSchema(String schema){String[] temp = schema.split("targetNamespace");String nameSpace = temp[1].split("\"")[1];return nameSpace;}/** * 获取namspace前缀 * @param schema * @return */private static List getTNSPrifix(String schema){List prifixs = new ArrayList();String nameSpace = getNameSpaceFromSchema(schema);String handStr = schema.substring(0, schema.indexOf(">")+1);String[] strs = handStr.split("\""+nameSpace+"\"");for(int i=0;i<strs.length;i++){String str = strs[i].trim();if(str.lastIndexOf("=")==str.length()-1){String tnsPrifix = "";if(str.lastIndexOf("xmlns:")!=-1 && "=".equals(str.substring(str.length()-1).trim())&&str.indexOf("targetNamespace")==-1){tnsPrifix = str.substring(str.lastIndexOf("xmlns:"),str.length()-1).replaceAll("xmlns:", "").trim();prifixs.add(tnsPrifix);}}}return prifixs;}/** * 获取xsd文件前缀 * @param schema * @return */private static String getXSDPrifix(String schema){String handStr = schema.substring(0, schema.indexOf(">")+1);String result = "";if(handStr.indexOf("<schema")==-1)result = handStr.substring(1,handStr.indexOf(":"));return result;}/** * 获取xsd中的基本类型 * @return */private static List getXSDType(){List xsdType = new ArrayList();xsdType.add("boolean");xsdType.add("double");xsdType.add("float");xsdType.add("int");xsdType.add("long");xsdType.add("string");xsdType.add("integer");xsdType.add("decimal");xsdType.add("dateTime");xsdType.add("QName");xsdType.add("anyURI");return xsdType;}?
?