操作xml文件,实现一一对应关系数值的高效转换
2018-06-27 11:59
309 查看
4000
package com.videtek.vacp.common; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.InputStream; import java.util.*; /** * @author hehaifeng * @date 2018-4-23 * @version 1.0 * * 工具类:主要用于字典值和国标值的转换 */ public class DictionaryTransformUtil { /** * xml 配置文件根元素 */ private static Element root; /** * 用于存放一级目录名和目录内容的 * key值:一级目录名,value值:该一级目录下的二级目录名 */ private static Map<String,Set<String>> allClass; /** * 日志对象,用于记录该工具类的运行情况 */ public static final Logger logger = LoggerFactory.getLogger(DictionaryTransformUtil.class); /** * 构造方法 */ public DictionaryTransformUtil() { } /** * * @param bigType 一级分类(人,骑车人,汽车,通用) * @param type 二级分类 * @param source 国标码 * @return 转换之后的编码 */ public static String transformDictionary(String bigType,String type, String source) { // 重要对象参数验证 if (root==null||allClass==null||allClass.size()==0){ logger.info("配置文件初始化失败!"); return null; } // 转换查询参数验证 if (StringUtils.isBlank(bigType)||StringUtils.isBlank(type)||StringUtils.isBlank(source)) { logger.info("转换参数为空"); return null; } // 如果Map集合中包含一级分类,而且该一级分类中也包含二级分类 if (allClass.containsKey(bigType)&&allClass.get(bigType).contains(type)){ // 在配置文件中,先找到一级分类标签,再找到二级分类标签,然后获取二级分类标签里的所有元素 List<Element> smallType = null; //如果配置文件配置不当,有可能出现空指针异常 try{ smallType = root.element(bigType).element(type).elements(); }catch (Exception e){ e.printStackTrace(); logger.error(e.getMessage()); } // 进行参数验证 if(smallType==null || smallType.size()==0){ return null; } // 遍历该二级分类里的所有元素 for (Element e:smallType) { // 获取元素上 decode 属性的值 String code = e.attributeValue("decode").trim(); // 获取元素上 soure属性的值 String soure = e.attributeValue("soure").trim(); // 如果code soure 都不为空,而且 soure等于 source 那就返回code的值 if (StringUtils.isNotBlank(code)&&StringUtils.isNotBlank(soure)&&source.equals(soure)){ return code; } } } // 如果是其他条件,则返回null值表示转换失败 return null; } /** * 类加载时读取并初始化静态资源 */ static { // 读取配置文件 SAXReader reader = new SAXReader(); Document doc = null; try { // 直接写路径容易读取文件失败,这种写法就可以保证Servlet容器中 resources目录下的文件读取成功 InputStream xml = DictionaryTransformUtil.class.getResourceAsStream("/dictionaryTransform.xml"); doc = reader.read(xml); } catch (Exception e) { e.printStackTrace(); logger.error("读取配置文件失败:"+e.getMessage()); } // 获取文件根元素 root = doc.getRootElement(); // 获取根元素下的 items 元素 Element items = root.element("items"); if (items==null){ logger.error("没有在配置文件里找到 items 标签"); }else { // 获取 items 元素里的 所有下一级元素(一级分类),不允许重复 Set<Element> bigClass = new HashSet<Element>(items.elements()); // 初始化一个map集合,长度为items里元素的个数(一级分类的个数) allClass = new HashMap<>(bigClass.size()); // 遍历这些一级分类 for (Element e:bigClass) { //给map集合赋值,key值就items里的元素名(一级分类),value值就是每个items里的子分类(二级分类) allClass.put(e.getName(),new HashSet(Arrays.asList(e.getTextTrim().split(",")))); } } } /** * 配置文件示例: * <?xml version="1.0" encoding="UTF-8"?> * <transformation> * * <!--总类别--> * <items> * 一级分类 * <!-- 汽车--> * <vehicle> * <!-- 多个分类之间用逗号隔开 --> * </vehicle> * <!-- 行人--> * <person> * <!-- 多个分类之间用逗号隔开 --> * </person> * <!--骑车人--> * <bicycle> 1bb8c * * </bicycle> * <!-- 可以共用的类型--> * <common> * driverCount * </common> * </items> * * <!--decode对应字典表(tb_sys_dictionary_value)里的value_code, soure 是国标值--> * * <!--公用的--> * <common> * * <!--驾驶人数--> * <driverCount> * <!-- 0,0人,0--> * <item decode="0" soure="0" /> * <!--1,1人,1--> * <item decode="1" soure="1" /> * <!--2,2人,2--> * <item decode="2" soure="2" /> * <!--3,更多人,3--> * <item decode="3" soure="3" /> * </driverCount> * </common> * * </transformation> */ }阅读更多
相关文章推荐
- DOM文档操作和XML文件互相转换的java实现
- Java实现DOM文档操作和XML文件互相转换
- Java实现DOM文档操作和XML文件相互转换
- 该文简要描述了DOM概念和内部逻辑结构,给出了DOM文档操作和XML文件互相转换java实现过程。
- DOM文档操作和XML文件互相转换的java实现
- Java实现DOM文档操作和XML文件互相转换
- loadrunner实现使用相同excel文档不同列的数据同时参数化多个字段,实现插入的数据一一对应
- Android JNI中Java与C++对象如何建立一一对应的关系
- JAVA使用Dom4j实现字符串和xml文件相互转换
- JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法
- JAVA基础 day21 字节流的输入和输出 字节流的缓冲区 (自己实现BufferedInputStream) 键盘输入 转换流的用法 改变标准输入输出设备 IO流操作的基本规律
- 高效实现Map的原子更新操作(Hystrix的InternMap<K, V>源码解析)
- SqlServer数据类型、C#SqlDbType对应关系及转换
- c#Dbtype与SQL dbtype一一对应关系,提高效率关键
- 从键盘输入某个十进制小数或整数,转换成对应的二进制小数并输出。 (查询十进制小数转换成二进制小数的算法,使用循环来实现。 最多保留小数位后7位数字即可)算法
- python - 穷举所有的数据结构,以及对应的一些实现。还是要多用,熟能生巧 = 技巧多样 + 操作稳定。
- ASP通过XMLDom在服务器端操作XML文件的主要方法和实现。
- SQL Server 2005: 利用新的ranking函数实现高效的数据分页操作
- 关于JPA多数据源的部署persistence.xml文件配置以及对应实现类注入
- c语言实现,将一个字符串转换为对应的整数