public class RuleLoader {
private static final Log logger = LogFactory.getLog(RuleLoader.class);
private URL digesterRulesURL;
private URL fileURL;
public RuleLoader(String rulePath,String filePath){
digesterRulesURL= getURL(rulePath);
fileURL = getURL(filePath);
// digesterRulesURL= getClass().getClassLoader().getResource(rulePath);
}
public RuleLoader(URL digesterRulesURL,URL fileURL){
this.digesterRulesURL = digesterRulesURL;
this.fileURL = fileURL;
}
public static RuleLoader getXmlRuleLoader(String filePath){
URL url = getURL("classpath:com/aisino/common/parse/xml-rules.xml");
return new RuleLoader(url,getURL(filePath));
}
/**
*
* 自定义指定规则
* 需要对Digester 解析规则熟悉
* @return
*/
public List parseRules(){
ClassLoader classLoader = getClass().getClassLoader();
Object root = new ArrayList();
try {
DigesterLoader.load(digesterRulesURL, classLoader, fileURL,root);
} catch (IOException e) {
logger.error("IOException");
} catch (SAXException e) {
logger.error("SAX error");
} catch (DigesterLoadingException e) {
logger.error("an error occurs while parsing XML into Digester rules");
}
return (List)root;
}
/**
*
* 解析XML数据,并将数据保存至Map
* 最多支持5级
* XML节点:主要表示root、level1,level2,level3,level4,level5
* for example:
*
*
*
*
*
*
*
*
*
* ...
*
约定 ${}为节点对应nodeName值
${root} = dataExchangePackage
${level1}==envelopeInfo
${level2}==sourceID...
* @param input
* @return Map
* 从map 获取值
* 如果key 是叶子节点:则返回string,反之,为Map
* 如果想取sourceID的值,则key=/dataExchangePackage/envelopeInfo/sourceID
*/
public static Map reParseRules(String filePath,InputStream input){
List rules = RuleLoader.getXmlRuleLoader(filePath).parseRules();
if(rules != null && rules.size()>0){
Digester digester = new Digester();
Node root=(Node)rules.get(0);//根节点
MapSetNextRule rule = new MapSetNextRule("put");
addRule2Dister(digester, root,"", rule,true);
try {
Map valueMap = new HashMap();
Map parseMap = (Map)digester.parse(input);
valueMap.putAll(parseMap);
afterRootMap(parseMap,valueMap,"");
return valueMap;
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}finally{
digester=null;
}
}
return null;
}
private static void afterRootMap(Map valueMap,Map destMap,String pattern){
String fullPattern="";
Iterator keys = valueMap.keySet().iterator();
while(keys.hasNext()){
Object key = keys.next();
Object v = valueMap.get(key);
fullPattern= pattern+"/"+key;
if(v instanceof Map){
afterRootMap((Map)v,destMap,fullPattern);
}else{
logger.debug(fullPattern+">>>>对应元素>"+v+" 放入返回栈中");
destMap.put(fullPattern, v);
}
}
}
private static URL getURL(String resourceLocation){
try {
if (resourceLocation.startsWith(ResourceHelper.CLASSPATH_URL_PREFIX)) {
return ResourceHelper.getURL(resourceLocation);
} else if(resourceLocation.startsWith(ResourceHelper.FILE_URL_PREFIX)) {
resourceLocation = StringUtils.replace(resourceLocation, ResourceHelper.FILE_URL_PREFIX, "");
return new File(resourceLocation).toURI().toURL();
}
} catch (Exception e) {
logger.error("解析XML路径时,出错");
}
return null;
}
/**
* 递归添加解析规则
* @param digester
* @param node :当前节点
* @param pattern:规则
* @param rule:支持map添加
* @param isRoot 是否为根节点
*/
private static void addRule2Dister(Digester digester,Node node,String pattern,MapSetNextRule rule,boolean isRoot){
String fullPattern="";
if(StringUtils.isNotBlank(pattern)){
fullPattern = pattern+"/"+node.getNodeName();
}else{
fullPattern = node.getNodeName();
}
if(node.getChildren().size()>0){
logger.debug(" add rules >>> digester.addObjectCreate("+fullPattern+", HashMap.class);");
digester.addObjectCreate(fullPattern, HashMap.class);
if(StringUtils.isNotBlank(node.getAttrs())){
String[] attrs =StringUtils.split(node.getAttrs(),",");
logger.debug(fullPattern+"有属性:"+ToStringBuilder.reflectionToString(attrs));
for(int i=0;i
String attr= attrs[i];
logger.debug(" add rules >>> digester.addCallMethod("+fullPattern+",\"put\", 2)");
logger.debug(" add rules >>> digester.addObjectParam("+fullPattern+",0, "+attr+")");
logger.debug(" add rules >>> digester.addCallParam("+fullPattern+",1, "+attr+")");
digester.addCallMethod(fullPattern, "put", 2);
digester.addObjectParam(fullPattern, 0, attr);
digester.addCallParam(fullPattern, 1,attr);
}
}
if(!isRoot){//不是根节点
logger.debug(" add rules >>> digester.addRule("+fullPattern+", rule);");
digester.addRule(fullPattern, rule);
}
for(int i=0;i
Node child = (Node)node.getChildren().get(i);
addRule2Dister(digester,child,fullPattern,rule,false);
}
}else{
//叶子节点
logger.debug("add rules >>> digester.addCallMethod("+fullPattern+", \"put\", 2)");
digester.addCallMethod(fullPattern, "put", 2);
logger.debug("add rules >>> digester.addObjectParam("+fullPattern+",0, "+node.getNodeName()+")");
digester.addObjectParam(fullPattern, 0, node.getNodeName());
logger.debug("add rules >>> digester.addCallParam("+fullPattern+",1)");
digester.addCallParam(fullPattern, 1);
}
}
...
}