XML解析——DOM4J

DOM4J

Dom4j是一个简单、灵活的开源库,dom4j使用接口和抽象基类,Dom4j的API相对要复杂一些但比JDOM更好的灵活性。 Dom4j是完美支持Xpath,具有性能优异、功能强大和极易使用的特点。采用的Dom4j需下载dom4j相应的jar文件


Document对象

DOM4J中,获得Document对象的方式有三种:

  • 读取XML文件,获得document对象
    SAXReader reader = new SAXReader();
    Document document = reader.read(url);
  • 解析XML形式的文本,得到document对象.
    String text = "";
    Document document = DocumentHelper.parseText(text);
  • 主动创建document对象.
    Document document = DocumentHelper.createDocument(); //创建根节点
    Element root = document.addElement("members");

节点对象的增删查改

  • 获取文档的根节点.
    Element root = document.getRootElement();
  • 取得某个节点的子节点.
    Element element=node.element(“书名");
    element.element("售价");
  • 取得节点的文字
    String text=node.getText();
  • 取得某节点下所有名为“member”的子节点
    List nodes = rootElm.elements("member");
  • 在某节点下添加子节点.
    Element ageElm = newMemberElm.addElement("age");
  • 设置节点文字.
    element.setText("29");
  • 删除某节点.
    parentElm.remove(childElm);//childElm是待删除的节点,parentElm是其父节
  • 添加一个CDATA节点.
    Element contentElm = infoElm.addElement("content");
    contentElm.addCDATA(diary.getContent());

节点对象属性

  • 取得某节点下的某属性
    Element root=document.getRootElement(); //属性名name
    Attribute attribute=root.attribute("size");
  • 取得属性的文字
    String text=attribute.getText();
  • 删除某属性
    Attribute attribute=root.attribute("size");
    root.remove(attribute);
  • 获取某节点的所有属性
    Element root=document.getRootElement();
    List attributes =root.attributes();
  • 设置某节点的属性和文字.
    newMemberElm.addAttribute("name", "sitinspring");
  • 设置属性的文字
    Attribute attribute=root.attribute("name");
    attribute.setText("sitinspring");

将文档写入XML文件

  • 文档中全为英文,不设置编码,直接写入的形式.
    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
    writer.write(document);
    writer.close();
  • 文档中含有中文,设置编码格式写入的形式.
    OutputFormat format = OutputFormat.createPrettyPrint();// 指定XML编码
    format.setEncoding("GBK");
    XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml"),format);
    writer.write(document);
    writer.close();

在指定位置插入节点

  • 得到插入位置的节点列表(list)
  • 调用list.add(index,elemnent),由index决定element的插入位置。
    Element元素可以通过DocumentHelper对象得到
    Element aaa = DocumentHelper.createElement("aaa");
    aaa.setText("aaa");
    List list = root.element("书").elements();
    list.add(1, aaa);//更新document

DOM4J解析编程

xml文档

 <书架>
    <书>
        <书名>浪潮之巅
        <作者>吴军
        <作者>李开复
        <售价>50
        <个人信息>50
    
    <书>
        <书名>数学之美
        <作者 title='ADS'>陆奇
        <售价>29
        <个人信息>50
    





解析代码并打印输出(不使用xpath)

//为了使代码结构清晰 异常全部thorws
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jDemo2
{
    public static void main(String[] args) throws DocumentException, IOException
    {
        // 获取document对象
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("book.xml"));

        // 1.调用getRootElement()获取文档的根节点.
        Element rootElement = document.getRootElement();

        // 调用element()第一本书 
        /*Element接口表示 HTML或 XML 文档中的一个元素。元素可能有与它们相关的属性;
        Element接口继承自 Node,方法更丰富,返回一个集合*/
        Element firstbook = rootElement.element("书");

        // 2、 elements()获取此元素节点的所有子节点
        List elements = firstbook.elements();
        //遍历集合中的元素子节点,打印所有元素子节点
        for (Element element2 : elements)
        {
            String text = element2.getText();
            System.out.println(element2.getName() + text);
        }

        // 取得某节点下所有名为“作者”的子节点,并打印出来 .
        List elements2 = firstbook.elements("作者");
        for (Object object : elements2)
        {//遍历子节点获取作者标签内的  文本内容
            Element element2 = (Element) object;
            System.out.println(element2.getText());
        }

        // 3、elements() element()修改某个元素节点的主体内容 修改第二本书的作者 为 李开复
        Element secondBook = (Element) rootElement.elements("书").get(1);
        Element secondBookAuthor = secondBook.element("作者");
        secondBookAuthor.setText("Kaifu Lee");

        System.out.println(secondBookAuthor.getText());

        // 4、addElement()向指定元素节点中增加子元素节点 第一本书增加ISBN 
        Element addElement = firstbook.addElement("ISBN");
        addElement.setText("987465498748");

        // 5、向指定元素节点上增加同级元素节点
        // 增加一本书 找到父节点 书架
        Element addElement2 = rootElement.addElement("书");
           //增加书名节点
        Element bookname = addElement2.addElement("书名");
        bookname.setText("解忧杂货铺");
         
        Element bookauthor = addElement2.addElement("作者");
        bookauthor.setText("东野圭吾");

        Element bookprice = addElement2.addElement("售价");
        bookprice.setText("2RMB");
               //增加售价的属性
        bookprice.addAttribute("where", "amazon");

        // 6、删除指定元素节点
        Element element = firstbook.element("个人信息");
        firstbook.remove(element);

        // 把内存中的dom树 写回到一个xml文件
        OutputFormat format = OutputFormat.createPrettyPrint();
        // 指定XML编码 输出到output.xml
        format.setEncoding("GBK");
        XMLWriter writer;
        writer = new XMLWriter(new FileOutputStream("output.xml"), format);
        writer.write(document);
        writer.close(); 
    }
}
控制台输出
书名浪潮之巅
作者吴军
作者李开复
售价50
个人信息
吴军
李开复
Kaifu Lee


解析代码并打印输出(使用xpath)

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

//使用Xpath的情况是
public class Dom4jDemo
{
    public static void main(String[] args) throws DocumentException, IOException, IOException
    {
        //获取Document对象
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("book.xml"));

        // 1.获取文档的根节点.
        // 第一本书 /书架/书[1]
        List selectNodes = document.selectNodes("/书架/书[1]");
        Element object2 = (Element) selectNodes.get(0);

        // 2、打印某节点的所有元素子节点
        List firstbookchildren = document.selectNodes("/书架/书[1]/*");
        for (Object object : firstbookchildren)
        {
            Element element = (Element) object;
            System.out.println(element.getName() + element.getText());

        }
        // 取得某节点下所有名为“作者”的子节点,并打印出来 
        List selectNodes2 = document.selectNodes("//作者");
        for (Object object : selectNodes2)
        {
            Element element2 = (Element) object;
            System.out.println(element2.getText());
        }
        // 3、修改某个元素节点的主体内容 修改第二本书的作者 为 李开复
        Element selectNodes3 = (Element) document
                .selectSingleNode("/书架/书[2]/作者");
        selectNodes3.setText("Owen");

        // 4、向指定元素节点上增加同级元素节点
        // 增加一本书 找到父节点 书架

        Element addElement2 = document.getRootElement().addElement("书");

        Element bookname = addElement2.addElement("书名");
        bookname.setText("解忧杂货铺");

        Element bookauthor = addElement2.addElement("作者");
        bookauthor.setText("东野圭吾");

        Element bookprice = addElement2.addElement("售价");
        bookprice.setText("2RMB");

        bookprice.addAttribute("where", "amazon");

        // 把内存中的dom树 写回到一个xml文件
        OutputFormat format = OutputFormat.createPrettyPrint();
                
        //// 指定XML编码 写出到指定文件           
        format.setEncoding("GBK");
        XMLWriter writer;
        writer = new XMLWriter(new FileOutputStream("output.xml"), format);
        writer.write(document);
        writer.close();
    }
}

控制台输出
书名浪潮之巅
作者吴军
作者李开复
售价50
个人信息
吴军
李开复
陆奇


OUTPUT.xml


<书架> 
  <书> 
    <书名>浪潮之巅  
    <作者>吴军  
    <作者>李开复  
    <售价>50  
    <个人信息>
      50
     
    
  <书> 
    <书名>数学之美  
    <作者 title="ADS">Owen  
    <售价>29  
    <个人信息>
      50
     
    
  <书>
    <书名>解忧杂货铺
    <作者>东野圭吾
    <售价 where="amazon">2RMB
  


你可能感兴趣的:(XML解析——DOM4J)