你的位置:首页 > Java教程

[Java教程]javaSE学习笔记DOM4J解析(7)


DOM4J即Document Object Model for Java使用java技术以文档方式解析

DOM4J是开源组织提供的一个免费的、强大的

dom4j is an Open Source

下载:http://sourceforge.net/projects/dom4j

引入:dom4j-1.6.1.jar (核心包)、 jaxen-1.1-beta-6.jar(Xpath支持包)

1 如何去学习一个开源的工具包?

一般的开源工具中都提供了免费的API文件,开发者可以参考该文档。

DOM4J提供的文档中有一个免费教程可以直接使用。à Quickstart

2 开始解析

1. 准备需要解析的<?"1.0" encoding="UTF-8" standalone="no"?><linkmans>  <linkman>    <name>jack</name>    <phone>18663243245</phone>    <email>jack@163.com</email>  </linkman>  <linkman>    <name>张三</name>    <phone>1353243247</phone>    <email>zs@126.com</email>  </linkman></linkmans>

2. 获取解析器// 2.获取解析器  public static SAXReader getReader(){    return new SAXReader();  }

3. 获取解析对象// 3.获取解析好的文档对象  public static Document getDocument(File file)throws Exception{    // 3.1获取解析器    SAXReader reader = getReader();    // 3.2解析文档    Document doc = reader.read(file);    return doc;  }

4. 获取根元素节点  // 4.获取根元素  public static void getRoot(File file)throws Exception{    // 4.1获取解析器    SAXReader reader = getReader();    // 4.2解析文档    Document doc = reader.read(file);    // 4.3获取根元素    Element root = doc.getRootElement();    System.out.println(root.getName());  }

5. 获取指定的其他的元素获取其他元素的时候默认需要从根节点开始查找。  // 5.获取指定的元素  public static void getElement(File file) throws Exception {    // 5.1获取解析器    SAXReader reader = getReader();    // 5.2解析文档    Document doc = reader.read(file);    // 5.3获取根元素    Element root = doc.getRootElement();    // 5.4获取所有的linkman    List list = root.elements("linkman");    Iterator it = list.iterator();    // 5.5循环遍历节点    while (it.hasNext()) {      Element ele = (Element) it.next();      System.out.println(ele.getName());    }    System.out.println("---------------");    // 简化    for (Iterator i = root.elementIterator(); i.hasNext();) {      Element element = (Element) i.next();      System.out.println(element.getName());    }    // 5.6获取第二个linkman的名字    Element linkman2 = (Element) list.get(1);    String name = linkman2.element("name").getText();    System.out.println(name);  }

6. 添加元素// 6. 添加元素  public static Document addElement(File file)throws Exception{    // 6.1获取解析器    SAXReader reader = getReader();    // 6.2解析文档    Document doc = reader.read(file);    // 6.3获取根元素    Element root = doc.getRootElement();    // 6.4创建新元素    Element new_linkman = DocumentHelper.createElement("linkman");    Element new_name = DocumentHelper.createElement("name");    Element new_phone = DocumentHelper.createElement("phone");    Element new_email = DocumentHelper.createElement("email");        new_name.setText("焦宁波");    new_phone.setText("186xxxxxxxxx");    new_email.setText("jnb@itcast.cn");    // 6.5建立关系    new_linkman.add(new_name);    new_linkman.add(new_phone);    new_linkman.add(new_email);    root.add(new_linkman);    return doc;  }

7. 修改的document需要进行持久化的操作,因此需要提供以下的方法// 提供一个工具方法将内存中的Document写入  public static void writeDocument2// 创建创建一个转换对象    new // 可以解决输入的数据时中文的乱码问题new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));    // 将doc写入指定文件    writer.write(doc);    // 释放资源    writer.close();  }

8. 修改元素  // 8. 修改元素  public static Document modifyElement(File file) throws Exception {    // 8.1获取解析器    SAXReader reader = getReader();    // 8.2解析文档    Document doc = reader.read(file);    // 8.3获取根元素    Element root = doc.getRootElement();    // 8.4直接获取第二个linkman的name    Element name = ((Element)root.elements("linkman").get(1)).element("name");    name.setText("李四");    return doc;  }

9. 删除元素// 9. 删除元素  public static Document removeAll(File file)throws Exception{    // 9.1获取解析器    SAXReader reader = getReader();    // 9.2解析文档    Document doc = reader.read(file);    // 9.3获取根元素    Element root = doc.getRootElement();    // 9.4获取所有的linkman    List list = root.elements("linkman");    // 9.4循环断绝关系    for(Object temp :list){      // 转型      Element linkman = (Element)temp;      // 断绝关系      root.remove(linkman);    }    return doc;  }

10. 属性的操作  // 10. 属性操作  public static Document optionAttribute(File file)throws Exception{    // 10.1获取解析器    SAXReader reader = getReader();    // 10.2解析文档    Document doc = reader.read(file);    // 10.3获取根元素    Element root = doc.getRootElement();    // 10.4获取所有的linkman    List list = root.elements("linkman");    // 10.4循环添加属性    int count = 0;    for(Object temp :list){      // 转型      Element linkman = (Element)temp;      // 添加属性      linkman.add(DocumentHelper.createAttribute(linkman, "id", "00"+(count+1)));      count++;    }    // 10.5获取焦宁波的id    Element linkman3 = (Element) list.get(2);    String value = linkman3.attribute("id").getText();    System.out.println(value);    // 10.6修改属性    linkman3.attribute("id").setText("007");    // 10.7删除属性    linkman3.remove(linkman3.attribute("id"));    return doc;  }  

问题:阅读以下的代码,并说出以下的代码的缺点。// 获取linkman中的linkman  public static void findQuestion(File file)throws Exception{    // 10.1获取解析器    SAXReader reader = getReader();    // 10.2解析文档    Document doc = reader.read(file);    Element inner_name = doc.getRootElement() // 获取根元素.element("linkman")    // 获取第一个linkman元素.element("linkman")    // 获取第一个linkman中的第一个linkman元素.element("name");       // 获取上面的name元素    System.out.println(inner_name.getText());  }

发现如果需要遍历一个比较深的元素节点,那么需要多次的element()。

如:存储一个自己的隐私文件需要建立100个文件夹吗?

那么如果路径比较长需要进行路径访问的方式的优化。

如果在DOM4J进行解析查找元素可以使用类似Windows中的路径模式来查找元素那么就变得简单且高效。

如果使用xpath代码可以简化如下:

// 使用xpath解决以上的问题  public static void findAnswer(File file)throws Exception{    // 10.1获取解析器    SAXReader reader = getReader();    // 10.2解析文档    Document doc = reader.read(file);    Element name = (Element) doc.selectSingleNode("/linkmans/linkman[1]/linkman/name");    System.out.println(name.getText());   }

以上的代码可以通过xpath快速的查找指定的元素节点,因此以后在实际的开发中我们如果需要解析