准备工作都做好了,接下来要把配置文件中的内容读入对象中,毕竟我们实际操作excel时还是要通过对象的属性来控制输出,xml还是在初始化的时候读取完毕备用.
说到读xml就不得不提dom4j了.dom4j是一个Java的XML API,用来读写XML文件的.dom4j性能优异、功能强大而且非常简单,很容易上手.
先来看段实际的代码.
private void ReadXML(String filename) { SAXReader reader=new SAXReader(); Document document=null; try { URL xmlpath=this.getClass().getClassLoader().getResource(filename); document=reader.read(xmlpath); Element root=document.getRootElement(); Element reportElement=null; //report JMyEntity report=null; //设置report数据 for(Iterator i=root.elementIterator();i.hasNext();) { reportElement=(Element)i.next(); if("report".equals(reportElement.getName())) { report=new Report(); } else if("import".equals(reportElement.getName())) { report=new Import(); } fillAttribute(reportElement,report); fillReportDetail(reportElement,report); jmyMap.put(report.getId(), report); } } catch (Exception e) { e.printStackTrace(); } }
稍微解释一下,document.getRootElement()是用来获取根结点的方法,在我的程序中获取的就是myreport结点,之后通过root.elementIterator();获取其子元素的迭代器循环,我们可以获得其所有子元素,按照我们的定义,子元素有report和import两种,将它们分别放入不同的对象中.然后调用fillAttribute方法对其属性进行填充,再用fillReportDetail填充其子元素,然后放入我们准备好的hashmap中,用id做为其键,之后我们便可以用id来访问具体的报表设定类,或者导入设定类了.
下面是fillAttribute的具体实现.
private void fillAttribute(Element parent,Object o) { Iterator i=parent.attributeIterator(); Attribute a=null; try { for(;i.hasNext();) { a=(Attribute)i.next(); BeanUtils.setProperty(o, a.getName(),a.getValue()); } } catch (Exception e) { e.printStackTrace(); } }
在这里我们利用apache的BeanUtils方便的为配置对象赋值,从参数中获取到attributeIterator迭代器,利用属性名来设置配置对象,因此为了这种设定,我们需要保持配置类的属性名和xml配置中的属性名一致,这样我们便省去了大量的set,代码简洁了很多.
至于fillReportDetail其实也很简单,就是分别为report赋予page、firsthead、dynamic等赋值.用到的方法无非还是BeanUtils以及dom4j的一些方法,那么就简要介绍一下几个用到的方法.
SAXReader的read(URL url)方法,其实还有一些重载方法不多介绍都是用来读取一个xml文件,需要的参数就是路径,会返回一个Document对象,代表了整个XML.
Document的getRootElement()方法,得到Root节点返回一个Element对象。熟悉XML的人都知道,一切XML分析都是从Root元素开始的.
Element的elementIterator()方法,可以获取到当前元素的子元素迭代器,返回Iterator对象,调用其next()方法便可获得子元素Element对象.
Element的attributeIterator()方法,用获取到当前元素的属性迭代器,返回Iterator对象,调用其next()方法便可获得属性Attribute对象.
Attribute的getName()方法,返回属性名,getValue()方法返回属性值.
其他的方法还有很多,就不多介绍了.
本次就到这里啦.内容不多,只是入入门,真深入的话,还是有很多可学的东西.下次就要进入正题了,开始探究JXL的奥秘了.