最近在学习dom4j的使用。
一直在思考一个问题,对于一种全新的或者说自己没接触过的技术,应该怎么样才能更好的上手并能尽可能的理解原理呢?
以前是怎么做的?
GOOGLE或者BAIDU找个最简单的例子,再下载到本地测试,然后跟着具体的需要来改。如果时间很久的话,这是比较有效的,因为能在项目中尽快的应付过去,可是这种事情多了,就有问题了,就会有太多的知其然不知其所以然,所花的时间对于原理的积累上一点都没有,而对于理解大师们的设计编程思想更是一点体会都没有,有的只是,好像有这么个东西,可以用来处理什么什么,好像还挺好用,有时还不懂怎么用!
现在想怎么做?
任何技术框架的出现都是为了方便的解决某些本来处理起来比较麻烦的技术而出现的。因此,对于原有的技术要有一个了解,知道原来出来时的麻烦。
接着,在对新技术可以按自己的理解,想,猜它会提供哪些帮助,然后再看介绍和了解它具体所提供的功能。
最后,才是练习。
麻烦:用Java本身的API来解释XML,有一个麻烦就是定位的不方便,这有点类似HTML用DOM来定位到具体某个组件的情况,而jQuery的出现就比较好的解决了这个问题。
因此可以猜
1、dom4j应该能提供这个帮助
<?xmlversion="1.0"encoding="UTF-8"?>
<USERS>
<USERID="0001">
<NAME>张三</NAME>
<SEX>男</SEX>
<AGE>20</AGE>
</USER>
<USERID="0002">
<NAME>李四</NAME>
<SEX>男</SEX>
<AGE>22</AGE>
</USER>
<USERID="0003">
<NAME>王五</NAME>
<SEX>男</SEX>
<AGE>24</AGE>
</USER>
</USERS>
2、类似这个users.XML,在USERS下有多个USER,那么dom4j也应该提供方便的获取所有USER标签的功能。
3、对于一个节点来说,比如<USER>,它有本身的名称,有自己的属性,也有可能有自己的子节点,而类似<NAME>还有它的值,通过dom4j应该怎么获取等等等等
怎么做?
1、导入dom4j的jar文件以及它所依赖的jar包
2、要解释XML,那怎么把读要解释的XML文件呢?那么多个类,我那知道用那个方法啊?但是因为是读文件,因此有没有个方法类似read(File)的呢?因此
点进去可以看到该方法的类是:SAXReader,还可以看到有read(InputStream)这个方法
因此:
SAXReaderreader=newSAXReader();
Documentdocument=reader.read(Dom4jTest.class.getResourceAsStream("users.xml"));
查看Document的API,知道有如下功能
1、获取Document文档的跟ROOT:document.getRootElement()
2、获取节点的名称:element.getName()
3、获取节点的所有属性:List<Attribute>attributeList=element.attributes();
4、获取属性名称:attribute.getName();
5、获取属性值:attribute.getData();
6、获取节点的所有直接子节点:
经过测试可以知道,elements()方法只会获取它的直接子节点Element
List<Element>elements=document.getRootElement().elements();
for(Elementelement:elements){
System.out.println(element.getName());
}
7、获取节点的值:element.getData()或者element.getText()
Dom4j结合XPATH就能更灵活的定位和选择,例如
Document.selectNodes("/USERS/USER");就把所有的USER节点都找到了
http://www.w3school.com.cn/xpath/xpath_syntax.asp
例子:
<? xmlversion="1.0"encoding="UTF-8"?>
<USERS>
<USER>
<id>0001</id>
<name>张三</name>
<sex>男</sex>
<age>20</age>
<address>北京</address>
</USER>
<USER>
<id>0002</id>
<name>李四</name>
<sex>男</sex>
<age>22</age>
<address>上海</address>
</USER>
<USER>
<id>0003</id>
<name>王五</name>
<sex>男</sex>
<age>24</age>
<address>南京</address>
</USER>
</USERS>
<?xmlversion="1.0"encoding="UTF-8"?>
<USERS>
<USER id="0001"address="北京">
<name>张三</name><sex>男</sex>
<age>20</age>
</USER><USERid="0002"address="上海">
<name>李四</name>
<sex>男</sex>
<age>22</age>
</USER>
<USERid="0003"address="南京">
<name>王五</name>
<sex>男</sex>
<age>24</age>
</USER>
</USERS>
publicclassUser{
privateStringid;
privateStringname;
privateStringsex;
privateIntegerage;
privateStringaddress;
//gettersetter......
@Override
publicStringtoString(){
return"ID="+id+",NAME="+name+",SEX="+sex+",AGE="+age+",ADDRESS="+address;
}
}
packagecom.xieqing.dom4j;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.commons.beanutils.BeanUtils;
importorg.dom4j.Attribute;
importorg.dom4j.Document;
importorg.dom4j.Element;
importorg.dom4j.io.SAXReader;
@SuppressWarnings("unchecked")
publicclassDom4jTest{
publicstaticvoidmain(String[]args)throwsException{
simpleTest();
System.out.println("-----------------------------------------------------------");
testXpath();
}
publicstaticvoidsimpleTest()throwsException{
SAXReaderreader=newSAXReader();
Documentdocument=reader.read(Dom4jTest.class.getResourceAsStream("users1.xml"));
List<User>userList=newArrayList<User>();
Useruser=null;
//遍历根节点下的所有直接子节点
for(Elementelement:document.getRootElement().elements()){
user=newUser();
List<Element>elList=element.elements();
//遍历USER节点下的所有子节点,并设置到user里
for(Elementel:elList){
BeanUtils.setProperty(user,el.getName(),el.getText());
}
userList.add(user);
}
System.out.println(userList);
}
publicstaticvoidtestXpath()throwsException{
SAXReaderreader=newSAXReader();
Documentdocument=reader.read(Dom4jTest.class.getResourceAsStream("users2.xml"));
List<User>userList=newArrayList<User>();
//读取//USERS/USER这个路径下的所有USER节点
List<Element>userElements=(List<Element>)document.selectNodes("//USERS/USER");
Useruser=null;
for(Elemente:userElements){
user=newUser();
//读取USER节点下的所有属性
List<Attribute>attrList=(List<Attribute>)e.selectNodes("@*");
for(Attributeattr:attrList){
BeanUtils.setProperty(user,attr.getName(),attr.getData());
}
//读取USER节点下的所有节点
List<Element>elList=(List<Element>)e.selectNodes("*");
for(Elementel:elList){
BeanUtils.setProperty(user,el.getName(),el.getData());
}
userList.add(user);
}
System.out.println(userList);
}
}