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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值