欢迎大家来到IT世界,在知识的湖畔探索吧!
最近在项目中要使用dom4j。
一直在思考一个问题,对于一种全新的或者说自己没接触过的技术,应该怎么样才能更好的上手并能尽可能的理解原理呢?
以前是怎么做的?
GOOGLE 或者 BAIDU找个最简单的例子,再下载到本地测试,然后跟着具体的需要来改。如果时间很久的话,这是比较有效的,因为能在项目中尽快的应付过去,可是这种事情多了,就有问题了,就会有太多的知其然不知其所以然,所花的时间对于原理的积累上一点都没有,而对于理解大师们的设计编程思想更是一点体会都没有,有的只是,好像有这么个东西,可以用来处理什么什么,好像还挺好用,有时还不懂怎么用!
现在想怎么做?
任何技术框架的出现都是为了方便的解决某些本来处理起来比较麻烦的技术而出现的。 因此,对于原有的技术要有一个了解,知道原来出来时的麻烦。
接着,在对新技术可以按自己的理解,想,猜 它会提供哪些帮助,然后再看介绍和了解它具体所提供的功能。
最后,才是练习。
麻烦
用Java本身的API来解释XML,有一个麻烦就是定位的不方便,这有点类似HTML用DOM来定位到具体某个组件的情况,而jQuery的出现就比较好的解决了这个问题。
因此可以猜
1、dom4j应该能提供这个帮助
<?xml version=”1.0″ encoding=”UTF-8″?>
<USERS>
<USER ID=”0001″>
<NAME>张三</NAME>
<SEX>男</SEX>
<AGE>20</AGE>
</USER>
<USER ID=”0002″>
<NAME>李四</NAME>
<SEX>男</SEX>
<AGE>22</AGE>
</USER>
<USER ID=”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)这个方法
因此:
SAXReader reader = new SAXReader();
Document document = 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 (Element element : 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
例子:
<?xml version=”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>
<?xml version=”1.0″ encoding=”UTF-8″?>
<USERS>
<USER id=”0001″ address=”北京”>
<name>张三</name>
<sex>男</sex>
<age>20</age>
</USER>
<USER id=”0002″ address=”上海”>
<name>李四</name>
<sex>男</sex>
<age>22</age>
</USER>
<USER id=”0003″ address=”南京”>
<name>王五</name>
<sex>男</sex>
<age>24</age>
</USER>
</USERS>
JavaBean
public class User {
private String id;
private String name;
private String sex;
private Integer age;
private String address;
// getter setter ……
@Override
public String toString() {
return “ID=”+id+”, NAME=”+name+”, SEX=”+sex+”, AGE=”+age+”, ADDRESS=”+address;
}
}
测试类
package com.xieqing.dom4j;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
@SuppressWarnings(“unchecked”)
public class Dom4jTest {
public static void main(String[] args) throws Exception {
simpleTest();
System.out.println(“———————————————————–“);
testXpath();
}
public static void simpleTest() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(Dom4jTest.class.getResourceAsStream(“users1.xml”));
List<User> userList = new ArrayList<User>();
User user = null;
// 遍历根节点下的所有直接子节点
for (Element element : document.getRootElement().elements()) {
user = new User();
List<Element> elList = element.elements();
// 遍历USER节点下的所有子节点,并设置到user里
for (Element el : elList) {
BeanUtils.setProperty(user, el.getName(), el.getText());
}
userList.add(user);
}
System.out.println(userList);
}
public static void testXpath() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(Dom4jTest.class.getResourceAsStream(“users2.xml”));
List<User> userList = new ArrayList<User>();
// 读取//USERS/USER 这个路径下的所有 USER 节点
List<Element> userElements = (List<Element>) document.selectNodes(“//USERS/USER”);
User user = null;
for (Element e : userElements) {
user = new User();
// 读取USER节点下的所有属性
List<Attribute> attrList = (List<Attribute>) e.selectNodes(“@*”);
for (Attribute attr : attrList) {
BeanUtils.setProperty(user, attr.getName(), attr.getData());
}
// 读取USER节点下的所有节点
List<Element> elList = (List<Element>) e.selectNodes(“*”);
for (Element el : elList) {
BeanUtils.setProperty(user, el.getName(), el.getData());
}
userList.add(user);
}
System.out.println(userList);
}
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/78103.html