xml-dom4j解析

2019-04-17  本文已影响0人  十六只猴子王

1. sax的解析原理:事件驱动

javax.xml.parse包里面


2. 使用jaxp的sax方式解析xml

sax方式不能实现增删改的操作,只能做查询的操作


3. 使用dom4j解析xml

dom4j,是一个组织,针对xml解析,提供解析器dom4j
dom4j不是javase的一部分,想要使用第一步应该导入dom4j提供的jar包


4. 使用dom4j查询xml

<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
  <name>zhangsan</name>
  <age>20</age>
</p1>
<p1>
  <name>lisi</name>
  <age>30</age>
</p1>
</person>

查询所有name元素里面的值

  1. 创建解析器
  2. 得到doucment
  3. 得到根节点getRootElement()
  4. 得到所有的p1元素
    element(qname)表示获取标签下面的第一个子标签。qname:标签的名称
    elements(qname)表示标签下面是这个名称的所有子标签(一层)
    elements():获取标签下面的所有一层子标签
  5. 得到name
  6. 得到name里面的值

得到第二个name里面的值

  1. 创建解析器
    SAXReader saxReader = new SAXReader();
  2. 得到document
    Document document - saxReader.read("src/p1.xml");
  3. 得到根节点
    Element root = document.getRootElement();
  4. 得到所有的p1
    List<Element> list = root.elements("p1");
  5. 得到第二个p1list集合下标cong0开始
    Element p2 = list.get(1);
  6. 得到p1下面的name
    Element name2 = p2.element("name");
  7. 得到name里面的值
    String s2 = name2.getText();
    System.out.println(s2);

5.在特定位置添加元素

在第一个p1下面的age标签之前添加<school>exit</school>
步骤:

  1. 创建解析器
  2. 得到document
  3. 得到根节点
  4. 获取到第一个p1
  5. 获取p1下面的所有元素element()方法返回的是list集合
    使用list里面的方法,在特定的位置添加元素
    首先创建元素,在元素下面创建文本
    使用DocumentHelper类方法createElement创建标签
    把文本添加到标签下面使用setText(“文本内容”)方法
    list集合里面的add(int index,E element)
    的一个参数是 位置下标,从0开始第二个参数是要添加的元素
    6.回写xml
package day6dom4jadd;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileOutputStream;
import java.util.List;

public class add {
   public static void main(String[] args) throws Exception {
       add();
   }

   public static void add() throws Exception {
       //创建解析器
       SAXReader saxReader = new SAXReader();
       //得到document
       Document document = saxReader.read("src/day6dom4jadd/person.xml");
       //得到跟节点
       Element rootElement = document.getRootElement();
       //获取第一个p1
       Element p1 = rootElement.element("p1");
       //获取p1下面的所有的元素
       List<Element> elements = p1.elements();
       //创建元素使用
       Element school = DocumentHelper.createElement("school");
       //在school下创建文本
       school.setText("exit");
       //在特定位置添加
       elements.add(1, school);
       //回写xml
       OutputFormat format = OutputFormat.createPrettyPrint();
       XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day6dom4jadd/person.xml"), format);
       xmlWriter.write(document);
       xmlWriter.close();
   }

}

实现封装

package day6dom4jadd;

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileOutputStream;

public class Dom4jUtils {
    public static final String PATH = "src/day6dom4jadd/person.xml";
    public static Document getDocument(String path) {
        try{
            //创建解析器
            SAXReader reader = new SAXReader();
            //得到document
            Document document = reader.read(path);
            return document;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
    //回写方法
    public static  void xmlWriters(String path,Document document){
        try {
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),format);
            xmlWriter.write(document);
            xmlWriter.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
package day6dom4jadd;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileOutputStream;
import java.util.List;
public class add {
    public static void main(String[] args) throws Exception {
        add();
    }

    public static void add() throws Exception {
        //创建解析器
       // SAXReader saxReader = new SAXReader();
        //得到document
//        Document document = saxReader.read("src/day6dom4jadd/person.xml");
        //方法的封装
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到跟节点
        Element rootElement = document.getRootElement();
        //获取第一个p1
        Element p1 = rootElement.element("p1");
        //获取p1下面的所有的元素
        List<Element> elements = p1.elements();
        //创建元素使用
        Element school = DocumentHelper.createElement("school");
        //在school下创建文本
        school.setText("exat");
        //在特定位置添加
        elements.add(1, school);
        //回写xml
       /* OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/day6dom4jadd/person.xml"), format);
        xmlWriter.write(document);
        xmlWriter.close();*/
       //回写方法的封装
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH,document);
    }

}

把document的操作和回写xml进行封装方法
也可以吧传递的文件路径,封装给一个常量
好处:可以提高代码的开发速度,可以提高代码的可维护性


6.使用dom4j实现与元素的修改

修改第一个p1下面的age元素的值<age>300</age>

public static void modifyAge()throws Exception{
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到第一个根节点
        Element rootElement = document.getRootElement();
        //得到p1
        Element p1 = rootElement.element("p1");
        //得到p1下面的age
        Element age = p1.element("age");
        //修改age的值
        age.setText("300");
        //回写xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH,document);
    }

7. 使用dom4j实现与元素的删除

//删除节点
    public static void del(){
        //得到document
         Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根节点
        Element rootElement = document.getRootElement();
        //得到p1元素
        Element p1 = rootElement.element("p1");
        //得到p1下面的school标签
        Element school = p1.element("school");
        //删除shcool,通过父节点删除,获得父节点的方法:sch.getParent();//获得school的父节点p1
        p1.remove(school);
        //回写xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH,document);
    }

8.使用dom4j获取属性值的方法

查看第一个p1里面的属性值

//查看属性的值
    public static void getValues() throws Exception {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根节点
        Element rootElement = document.getRootElement();
        //得到p1元素
        Element p1 = rootElement.element("p1");
        String id1 = p1.attributeValue("id1");
        System.out.println(id1);
    }

attributeValue()获取属性的值


9.使用dom4j支持xpath

可以直接获取某个元素

使用xpath实现:查询xml中所有name元素的值

  1. 得到document
  2. 直接使用selectNodes("//name")方法得到所有的name元素
package day6xpath;

import day6dom4jadd.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;

import java.util.List;

public class xpath {
    public static void main(String[] args) {
        test();
    }

    public static void test() {
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        List<Node> list = document.selectNodes("//name");
        for (Node node : list) {
            //node是每个name元素
            //得到name元素里面的值
            String s = node.getText();
            System.out.println(s);
        }
    }
}
package day6xpath;

import day6dom4jadd.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;

public class xpath2 {
    public static void main(String[] args) throws Exception {
        //使用xpath实现:获取第一个p1下面的name的值
        test2();
    }
    public static void test2()throws Exception{
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //直接使用selectSingleNode方法
        Node name1 = document.selectSingleNode("//p1[@id1='aaa']/name");
        //得到name里面的值
        String s1 = name1.getText();
        System.out.println(s1);

    }
}

上一篇下一篇

猜你喜欢

热点阅读