java 解析rmc_一键解析XML文件(利用Digester实现可配置)

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

}

}

...

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值