- Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发 JDOM的人分离出来而后独立开发的。
- 与JDOM不同的时,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
- Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
- 使用Dom4j开发,需下载dom4j相应的jar文件
查:
//1、创建解析器
SAXReader reader = new SAXReader();
//2、解析XML文档,返回document对象
Document document = reader.read("src/book.xml"):
//3、获取根结点
Element root = document.getRootElement();
//4、之后你懂的,就是操作DOM模型,无非就是子节点,父节点。
输出:(增删改都要用到输出)
//1、创建XMLWriter
XMLWriter writer = new XMLWriter(new FileStream("src/book.xml"));
writer.writer(document);
wirter.close():
<!--如果,中文输出时,会出现乱码的问题,需使用这句,其实真正写入的是FileStream的对象。
XMLWriter XMLWriter = new XMLWriter(new OutputStream(new FileStream("src/book.xml")),"UTF-8");
-->
删:
//获取要删除的结点
Element price = root.element("书").element("售价");
price.getParent().remove(price); //从父结点remove掉
改:
//修改第一本书的售价的价格
price.element("书").element("售价").setText("108元");
增:
//方法一:增加第一本书的售价的结点
Element price = DocumentHelper.createElement("售价");
price = setText("108元"):
root.element("书").add(price);
//方法二 :增加第一本书的售价的结点
root.element("书").addElement("售价").setText("899元")
//增加 :在指定位置添加一个售价结点(特殊)
List list = root.element("书").elements();
//创建要插入的节点
Element price = DocumentHelper.createElement("售价");
price.setText("89元");
list.add(2, price);
这样的Dom4j有个弱点,就是如果XML文档的结构是很深的话,就要不停的.element()来获取。针对这个情况,结合强大XPath就节省很多代码。
以下是XPath的使用方法,XPath的文档,也毫无渲染,直接来例子:
//获取第一本书的作者结点
Element e = (Element) document.selectSingleNode("//书/作者");
其中document是xml文档对象,也是上文的document
//获得第二本书结点
Element e = (Element) document.selectNodes("//书").get(1);
用户登录例子
//用户登陆
public static void test3() throws DocumentException{
String name = "aaa";
String password = "123";
login(name, password);
}
private static void login(String name, String password)
throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read("src/user.xml");
Element e = (Element) document.selectSingleNode("//user[@username='"+name+"' and @password='"+password+"']");
if(e!=null){
System.out.println("登陆成功!");
}else
System.out.println("登陆失败!");
}