xml-dom4j解析

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

javax.xml.parse包里面

  • SAXparse
    此类实例可以从SAXParerFactory.newSAXParser()方法获得
    parse(File f,DefaultHandle dh)//第一个参数xml路径,第二个参数事件处理器
    SAXParserFactory//实例newInstance()方法得到
    schema解析原理

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

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

  • 打印出整个文档
    执行parse方法,第一个参数xml路径,第二个参数是事件处理器
    创建一个类,继承时间处理的类,重写里面的三个方法
  • 获取到所有的name元素的值
    定义一个成员变量flag= false
    判断开始方法是否是name元素,如果是name元素,把flag的值设置成true
    如果flag的值是ture,在characters方法中打印内容
    当执行到结束方法的的时候,把flag的值设置成false
  • **获取第一个name元素的值
    定义一个成员变量idx=1
    在结束方法的时候,idx+1
    想要打印出第一个name元素的值,在characters方法里面判断,flag==true&&id==1,再打印内容

3. 使用dom4j解析xml

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

  • 得到document
    SAXReader reader = new SAXReader();
    Document doucment = reader.red(url);
  • document 的父接口是Node如果在document中找不到想要的方法,在Node里面找
  • document里面的 getRootElement():获取根节点返回的是Element
  • Element也是一个接口,父接口是Node
    Element和Node里面的方法
    getParent():获取父节点
    addElement():添加标签

4. 使用dom4j查询xml




  zhangsan
  20


  lisi
  30


查询所有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 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标签之前添加exit
步骤:

  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 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 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元素的值300

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

可以直接获取某个元素

  • 形式:
    /AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB
    //BBB 表示和这个名称相同的都得到
    /*:所有元素
    BBB[1]:表示第一个BBB元素
    BBB[last()]:表示最后一个BBB元素
    //BBB[@id]:表示BBB元素上有id属性都可以得到

  • 在dom4j中提供了两个方法,用来支持xpath
    selectNodes("xpath表达式")获得多个节点
    selectSingleNode("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 list = document.selectNodes("//name");
        for (Node node : list) {
            //node是每个name元素
            //得到name元素里面的值
            String s = node.getText();
            System.out.println(s);
        }
    }
}
  • 使用xpath实现:获取第一个p1下面的name的值
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);

    }
}

你可能感兴趣的:(xml-dom4j解析)