在用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;
}
分享到:
相关推荐
该工具支持WPS、doc*、tif、jpg、png、批量转换PDF文件,也支持压缩文件批量解压,批量合并PDF。
掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的...
oXygen验证XML,XSL和XQuery,FO,XSD,RNG,RNC,NRL,DTD的Schematron,WSDL和CSS内容,报告与描述和行号信息错误,以及将它们标记在文档中时,验证您键入时启用。更多的文件可以被逻辑地组织在项目中。它配备了...
Eclipse Xml编译错误引用的文件包含错误 - spring-beans-4.0.xsd 6年前 Git_语言_显示 修改GitHub上项目语言显示的问题 6年前 Gradle_依赖项_排除 Gradle 依赖排除 6年前 Gradle_依赖_管理 Gradle依赖管理 6年前 ...
目前,对创建EAD 2002 XSD架构兼容文档的支持相当强大,但是向迁移却非常强大。计划到2015年。 受控词汇 EAD的XForms编辑后端链接到以下Web服务,用于受控词汇和URI /授权文件号的摄取: 企业名称: , 姓氏: ...
17.4 异步文件操作 .227 17.5 小 结 .234 第十八章 高 级 话 题 .235 18.1 注册表编程 .235 18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 ...