二十三、自定义并解析Xml文件

来源:互联网 发布:女装品牌推荐 知乎 编辑:程序博客网 时间:2024/06/07 17:22

第一步,定义Xml文件。

随便定义一个xml,例如

<Info>

<Type>1</Type>

<Price>

     <PriceValue>10000</PriceValue>

</Price>

</Info>

 

第二步,获取Xml数据。

(Xml文件读入在页面上一般会用个弹出框或者浮层的展现形式,但从实现上一般来说都会是一个异步ajax请求。)

首先从request中取xml描述信息,比如

String  xmlDesc  = rundata.getRequest.getParameter(“content”);

处理下换行符等:

String  line =  System.getproperty(“line.separator”); 

xmlDesc = xmlDesc.replace(line,””);

xmlDesc = xmlDesc.replace(“\r”,””); 

xmlDesc = xmlDesc.replace(“\n”,””);

xmlDesc = xmlDesc.replace(“\r\n”,””);

然后检查xml是否符合xml规范:

Public  class  DocumentXmlHelper{Public  static   Document   read(String  xmlDesc){java.io.StringReader   stringReader = new  StringReader(xmlDesc); org.dom4j.io.SAXReader  saxReader  =  new  SAXReader(); boolean  valid = true;org.dom4j.Document  document = null;try{document = saxReader.read(stringReader);}catch(org.dom4j.DocumentException  e){                  valid = false;         }         if(valid){                  Return   document;         }}


 

  注:这是dom4j官方提供的对xml规范的校验。

 

 

如果符合xml规范即validtrue,继续将这段string形式xmlDesc保存成javabean

Public  static  SomeDO   parseXml(String xmlDesc){         Document  document = DocumentXmlHelper.read(xmlDesc);         SomeDO  someDO = new SomeDO();         If(document != null){                   Element  root = document.getRootElement();                   For(Iterator<Element>  fitrator = root.elementIterator(“Type”);fitrator.hasNext();){                            Element   e = (Element) fitrator.next();                            Int  type = Integer.parseInt(e.getTextTrim());                            someDO.setType(type);                   }                   For(Iterator  I =  root.elementIterator(“Price”);i.hasNext();){                            Element  element  = (Element) i.next();                            For(Iterator<Element>  fitrator = root.elementIterator(“PriceValue”);fitrator.hasNext();){                                     Element  e = (Element) fitrator.next();                                priceValue = Long.parseLong(e.getTextTrim());                                     someDO.setPriceValue(priceValue);                            }                   }         }}


 

 

 至此,定义解析xml就完成了。

---------------------------------------------------------------------------------------------------------------------------------

下面是根据业务规则对xmlDesc进行规则校验的过程了。

调用的是对象检查的统一服务接口:

List<String>  checkResults = objectCheckService.check(someDO); 返回结果是个String列表,给个string描述一条规则校验的结果,如果是true表示校验通过,如果不通过就可以显示在具体校验类中返回的原因描述。

Public  interface  ObjectCheckService{

         List<String>   check(Object  obj) ;

}

Public  class   ObjectCheckServiceImpl  implements  ObjectCheckService{

         Public   List<String>  check(Object obj){

1.       取容器启动时就已经加载好的需校验条件列表。

每个规则校验类都实现统一接口ObjectCheck,这样在spring容器启动时就可以全部加载起来,通过ApplicationContextgetBeanNamesForTypeObjectCheck.class,true,false)方法得到所有实现了ObjectCheck的类名,然后再通过类名获得类实例ObjectCheck  objectCheck = applicationContext.getBean(objectChekName,ObjectCheck.class);将这些objectCheckaddobjectCheckList列表中。

2.       定义一个倒计数的锁存器CountDownLatch变量doneSingal,初始值为1中需校验条件列表长度objectCheckList.size()

3.       对每个需校验条件进行校验。每种规则的校验都通过线程池中一个线程完成,直到countDownLatch变量值减为0,所有校验才都完成返回校验结果。

threadPool.execute( new WorkerRunnable(doneSingal, objectCheck,返回结果featureResult, someDO);

每个校验规则new出来的WorkerRunnable线程的run方法只要做一件事,就是调用规则校验实例objectCheckcheck方法,将返回结果addfeatureResult,计数器减一,这样等多个线程共同操作的计数器变量减到0时所有校验就完成了,会自动返回featureResult.

         }

}

接下来是具体定义每个校验类。建议一类规则一个校验类。

Public  String  check(SomeDO someDO){

         //someDO.getType==1然后怎样,这就根据业务了,不满足的话就return  “type必须是1才可以**,嘿嘿

}