`
marb
  • 浏览: 409706 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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的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;
	}
 

 

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics