在用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的xsd
if(!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;
}