休息食客

随心而动

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  16 随笔 :: 7 文章 :: 2 评论 :: 0 Trackbacks
java解析xml文件的方式有几种,下面介绍用dom4j方式解析

1、先看一段xml内容
  1 <configs>
  2 
  3     <config key="01002" name="支付申请表" order="1">  <!--key为config键。 order为级别 ,1为最高级别,级别越高,放在最前面,相同级别无须-->
  4         <!-- 取数模式 D:按日生成  M:按月生成  Y:按年生成 -->
  5         <mode>D</mode>
  6         <!-- 依赖数据,需校验parent是否已生成成功 -->
  7         <parents></parents>
  8         <!-- 初始抽取时间 -->
  9         <defaultTime>2013-05-01</defaultTime>
 10         <!-- 数据源SQL -->
 11         <sqls>
 12             <sql>
 13             <![CDATA[
 14             select * from XXX
 15             ]]>
 16             </sql>
 17             <sql>
 18             <![CDATA[
 19             select * from XXX
 20             ]]>
 21             </sql>
 22         </sqls>
 23         <!-- 上传数据源字段类型及长度 -->
 24         <colTypes>
 25             <colType>
 26                 <type>number</type>
 27                 <length>18</length>
 28             </colType>
 29             <colType>
 30                 <type>string</type>
 31                 <length>10</length><!-- char或者varchar统一定义为string -->
 32             </colType>
 33         </colTypes>
 34         <!-- 上传、下载文件生成配置 ,最多4个文件,数据文件、校验文件、文件级校验报告、记录级校验报告 -->
 35         <files>
 36             <file type="data">
 37                 <name>a_10100_EBS_{YYYYMMDD-D}_01002_{NO}_{SERIAL}</name> <!-- 文件名, {}扩起部分为通配,YYYYMMDD-D代表数据日期,YYYYMMDD-S代表系统日期 -->
 38                 <suffix>.dat</suffix>    <!-- 生成的文件后缀名 -->
 39                 <code>GBK</code>    <!-- 生成的文件编码格式 -->
 40                 <compress>GZ</compress>    <!-- 生成文件需压缩的文件类型,自定义通配 -->
 41                 <size>2000000000</size>    <!-- 文件大小,超出则分割, byte -->
 42                 <tempPath>temp</tempPath><!-- 临时存放路径 -->
 43                 <path>data</path> <!-- 上传、下载的路径 -->
 44             </file>
 45             <file type="check">
 46                 <name>a_10100_EBS_{YYYYMMDD-D}_01002_{NO}</name>
 47                 <suffix>.verf</suffix>
 48                 <code>GBK</code>
 49                 <compress>GZ</compress>
 50                 <size>1024</size>
 51                 <tempPath>temp</tempPath><!-- 临时存放路径 -->
 52                 <path>data</path>
 53             </file>    
 54         </files>
 55     </config>
 56     
 57     <config key="01004" name="调拨申请表" order="1">
 58         <!-- 取数模式 D:按日生成  M:按月生成  Y:按年生成 -->
 59         <mode>D</mode>
 60         <!-- 依赖数据,需校验parent是否已生成成功 -->
 61         <parents></parents>
 62         <!-- 初始抽取时间 -->
 63         <defaultTime>2013-05-01</defaultTime>
 64         <!-- 数据源SQL -->
 65         <sqls>
 66             <sql>
 67             <![CDATA[
 68                select * from XXX
 69             ]]>
 70             </sql>
 71             <sql>
 72             <![CDATA[
 73                select * from XXX
 74             ]]>
 75             </sql>
 76         </sqls>
 77         <!-- 上传数据源字段类型及长度 -->
 78         <colTypes>
 79             <colType>
 80                 <type>number</type>
 81                 <length>18</length>
 82             </colType>
 83             <colType>
 84                 <type>string</type>
 85                 <length>10</length>
 86             </colType>
 87         </colTypes>
 88         <!-- 上传文件生成配置 ,最多2个文件,数据文件和校验文件,不需要校验文件,可屏蔽 -->
 89         <files>
 90             <file type="data">
 91                 <name>a_10100_EBS_{YYYYMMDD-D}_01004_{NO}_{SERIAL}</name> <!-- 文件名, {}扩起部分为通配 ,YYYYMMDD-D代表数据日期,YYYYMMDD-S代表系统日期 -->
 92                 <suffix>.dat</suffix>    <!-- 生成的文件后缀名 -->
 93                 <code>GBK</code>    <!-- 生成的文件编码格式 -->
 94                 <compress>GZ</compress>    <!-- 生成文件需压缩的文件类型,自定义通配 -->
 95                 <size>2000000000</size>    <!-- 文件大小,超出则分割, byte -->
 96                 <tempPath>temp</tempPath><!-- 临时存放路径 -->
 97                 <path>data</path>
 98             </file>
 99             <file type="check">
100                 <name>a_10100_EBS_{YYYYMMDD-D}_01004_{NO}</name>
101                 <suffix>.verf</suffix>
102                 <code>GBK</code>
103                 <compress>GZ</compress>
104                 <size>1024</size>
105                 <tempPath>temp</tempPath><!-- 临时存放路径 -->
106                 <path>data</path>
107             </file>        
108         </files>
109     </config>
110     
111 </configs>
别管xml要提供的功能,只看结构,根节点是configs,一级节点是两个config,然后config里面有多个子节点mode、parents、defaultTime、sqls、colTypes、file,然后sqls等等还有子节点,那么要怎么一级一级获取呢?

2、看java代码:
  1 try {
  2             String path = InterfaceConfig.class.getResource("").getPath().toString();//获取类所在路径
  3             if (path.contains(".jar")) {
  4                 path = path.replace("/", File.separator);//将/换成\
  5                 path = path.replace("file:""");//去掉file
  6                 path = path.replace("classes\\""");//去掉classes\
  7                 if (path.startsWith("\\")) {
  8                     path = path.substring(1);//去掉第一个\,如:、\D:\TongWeb  ,在linux上没有这种情况
  9                 }
 10                 path = path.split("WEB-INF")[0]+"WEB-INF"+File.separator+"classes";
 11             } else {
 12                 path = InterfaceConfig.class.getResource("/").getPath().toString();//获取根路径
 13             }
 14             //String realPath = ActionUtils.getRequest().getRealPath("/")+File.separator+"WEB-INF"+File.separator+"classes";
 15             File file = new File(path + File.separator + "InterfaceConfig.xml");
 16             SAXReader reader = new SAXReader(); 
 17             Document doc = reader.read(file);
 18             Element root = doc.getRootElement(); 
 19             Iterator<Element> configs = root.elementIterator("config");
 20             InterfaceConfig ifc = null;
 21             while (configs.hasNext()) {
 22                 ifc = new InterfaceConfig();
 23                 Element config = configs.next();
 24                 
 25                 String key = config.attributeValue("key");
 26                 String name = config.attributeValue("name");
 27                 String order = config.attributeValue("order");
 28                 ifc.setKey(key);
 29                 ifc.setName(name);
 30                 ifc.setOrder(order);
 31                 
 32                 // 获取config下的mode
 33                 String modeValue = config.element("mode").getText();
 34                 ifc.setMode(modeValue);
 35                 
 36                 // 获取初始抽取时间
 37                 String defaultTime = config.element("defaultTime").getText();
 38                 ifc.setDefaultTime(defaultTime);
 39                 
 40                 // 获取config下的parents
 41                 List<Element> parents = config.element("parents").elements();
 42                 List<String> parentsList = new ArrayList<String>();
 43                 for (Element e : parents) {
 44                     parentsList.add(e.getText());
 45                 }
 46                 ifc.setParents(parentsList);
 47                 
 48                 //获取config下的sqls
 49                 List<Element> sqls = config.element("sqls").elements(); 
 50                 List<String> sqlsList = new ArrayList<String>();
 51                 for (Element e : sqls) {
 52                     String sqlValue = e.getText().replaceAll("\n"" ").replaceAll("\t"" ");
 53                     sqlsList.add(sqlValue);
 54                 }
 55                 ifc.setSqls(sqlsList);
 56                 
 57                 //获取config下的colTypes
 58                 List<Element> colTypes = config.element("colTypes").elements(); 
 59                 List<ColType> ctList = new ArrayList<ColType>();
 60                 ColType ct = null;
 61                 for (Element e : colTypes) {
 62                     ct = new ColType();
 63                     ct.setType(e.element("type").getText());
 64                     ct.setLength(e.element("length").getText());
 65                     ctList.add(ct);
 66                 }
 67                 ifc.setColTypes(ctList);
 68                 
 69                 //获取config下的files
 70                 List<Element> files = config.element("files").elements(); 
 71                 Map<String,ConfigFile> filesMap = new HashMap<String,ConfigFile>();
 72                 ConfigFile cf = null;
 73                 for (Element e : files) {
 74                     cf = new ConfigFile();
 75                     String type = e.attributeValue("type");
 76                     cf.setType(type);
 77                     cf.setName(e.element("name").getText());
 78                     cf.setSuffix(e.element("suffix").getText());
 79                     cf.setCompress(e.element("compress").getText());
 80                     cf.setCode(e.element("code").getText());
 81                     cf.setSize(Long.parseLong(e.element("size").getText()));
 82                     cf.setTempPath(e.element("tempPath").getText());
 83                     cf.setPath(e.element("path").getText());
 84                     filesMap.put(type, cf);
 85                 }
 86                 ifc.setFiles(filesMap);
 87                 lic.add(ifc);
 88                 
 89             }
 90             Map<String,InterfaceConfig> msi = null;
 91             for(InterfaceConfig ifcs : lic){
 92                 if(!msmsi.containsKey(ifcs.getOrder())){
 93                     msi = new HashMap<String,InterfaceConfig>();
 94                     msi.put(ifcs.getKey(), ifcs);
 95                     msmsi.put(ifcs.getOrder(),msi);
 96                 } else {
 97                     msmsi.get(ifcs.getOrder()).put(ifcs.getKey(), ifcs);
 98                 }
 99             }
100             
101         } catch (Exception e) {
102             throw new RuntimeException(e);
103         }

先获取configs里面的所有config,然后对它进行迭代,获取每一个config。
接下来是获取config里面的节点了,如果config里的子节点没有“后代”了,如mode节点,那么直接String modeValue = config.element("mode").getText();就获取值了,
但是如果config里的有些子节点还有子节点,如files节点,就List<Element> files = config.element("files").elements();放到一个集合里,然后循环取出。



posted on 2015-02-11 17:23 休息食客 阅读(412) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: