JAVAWEB第六天dom4j解析xml

一、简介
1、dom4j是一个组织,针对xml解析,提供dom4j解析器
2、dom4j不是属于javase的一部分,使用时的做法:导入dom4j提供的jar包。–创建一个文件夹,通常命名为lib,然后将jar包复制到lib下,右击jar包,build path—add to buildpath,看到jar包变成奶瓶的样子,表示导入成功。
3.dom4j也是形成dom4j树进行解析,但是集合了之前的两种方式优点
4.得到document

SAXReader reader=new SAXReader();
Document document=reader.read(url);

5、document 的父接口是Node,如果在document里面找不到要用的方法,去他的父类里面找。
document里面的方法,getRootElement();获取的根节点,返回的是Element,Element也是一个接口,其父接口也是Node。

getParent();获取父节点
addElement();添加标签

二、使用dom4j查询xml
1、查询所有那么元素
首先创建解析器,接着获取document,得到根节点,getRootElement,返回的是Element,得到所有的p1标签,
element(qname):获取标签下面的第一个字标签,qname标签的名称
elements(qname):获取标签下的所有字标签(第一层字标签)
element():获取标签下面的所有字标签
得到name,得到name里面的值
(注意导包的时候,要导正确)

package sax;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

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

    public static void select1() throws Exception {
        SAXReader saxReader=new SAXReader();
        Document document=saxReader.read("src/p1.xml");
        Element root=document.getRootElement();
        List<Element> list=root.elements("p1");
        //遍历list
        for (Element element : list) {
            Element name1=element.element("name");
            String s=name1.getText();
            System.out.println(s);
        }
    }

}

2、查询第一个name 值,这时只需要在获取的p1的时候,用root.element("p1");获取第一个p1即可。然后再获取第一个name
3、获取第二个p1的第一个name值。
得到所有的p1,这时返回一个list,然后通过list的下标来获取第二个p1,list.get(index)

List<Element> list=root.elements("p1");
        Element p2=list.get(1);
        Element name=p2.element("name");
        String s = p2.getText();
        System.out.println(s);

3.使用dom4j实现添加操作
在第一个p1标签末尾添加一个元素<sex>nv</sex>
步骤:创建解析器,获得document,得到根节点,得到第一个p1标签(使用element方法),在p1下面添加元素(在p1上面直接使用addElement(“标签名称”)方法,返回一个Element),在添加完成之后的元素上面添加文本(在sex上直接使用sexText(“文本内容”)方法),回写到xml中,格式化OutputFormat,使用creatprettyPrint方法,获得一个漂亮的格式,使用XMLWriter直接new这个类,传递两个参数(第一个参数:xml文件路径,new FileOutputStream(“路径”),第二个参数:格式化类的值)

package sax;

import java.io.FileOutputStream;

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 Testdom4j {
    public static void main(String[] args) throws Exception {
        addNode();
    }

    public static void addNode() throws Exception{
        SAXReader saxReader=new SAXReader();
        Document document = saxReader.read("src/p1.xml");
        Element root=document.getRootElement();
        Element p1=root.element("p1");
        Element sex1=p1.addElement("sex");
        sex1.addText("nv");
        //回写到xml中
        OutputFormat format=OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/p1.xml"),format);
        xmlWriter.write(document);
        xmlWriter.close();
    }

}

4、在指定位置添加元素
在第一个p1下面的age标签之前添加<school>zhenghang</school>
步骤:(1)创建解析器 (2)获得document (3) 获取根节点,获得第一个p1(4)获得p1下面的所有元素,使用elements方法,返回List,使用list里面的方法,在特定位置添加元素即add()方法,使用之前创建元素,创建文本。add(index,element)第一个是要在哪里之前插入,第二个是元素名称。(5)回写到xml中。

package sax;

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

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

public class Test4 {
    public static void main(String[] args) throws Exception {
        addCertain();
    }
    public static void addCertain() throws Exception {
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read("src/p1.xml");
        Element root = document.getRootElement();
        Element p1 = root.element("p1");
        List<Element> list = p1.elements();
        //创建标签
        Element school = DocumentHelper.createElement("school");
        school.setText("zhenghang");
        list.add(1, school);
        //回写到xml中
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/p1.xml"),format);
        xmlWriter.write(document);
        xmlWriter.close();

    }

}

5、方法的封装
得到document和回写到xml进行封装成方法,把传递的文件路径封装成一个常量。

package sax;

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

public class Dom4jUtils {
    public static final String PATH="src/p1.xml";
    public static Document getDocument(String path) {
        try {
            SAXReader saxReader = new SAXReader();      
            Document document = saxReader.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();
        }


    }

}

封装的好处:提高开发效率,提高代码的可维护性。(比如修改路径,只需要修改常量就可以,而不用对其他代码进行更改)
6、修改元素的值
修改第一个p1中age的值

package sax;

import org.dom4j.Document;
import org.dom4j.Element;

public class Test4jj {
    public static void main(String[] args) {
        modify();
    }
    public static void modify() {
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        Element root = document.getRootElement();
        Element p1 = root.element("p1");
        //element 获得的是你写的标签的名字中的第一个,不在乎name和age的位置
        Element age = p1.element("age");
        //修改age的值,setText()可以设置age值,也可以修改age值
        age.setText("50");
        //回写到文件中
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
    }

}

补:ctrl+shift+o快速导包
7.删除元素
删除school
注意:通过父节点进行删除remove(Element args0),返回值是boolean类型
获取p1,获取p1下面的school,通过p1删除school

Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        Element root = document.getRootElement();
        Element p1 = root.element("p1");
        Element sch = p1.element("school");
        p1.remove(sch);

        Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);

8.获取属性值
增删改需要回写,查询不需要回写。
获取第一个p1的id1属性值通过attributeValue(“属性名称”)方法来实现,返回值是String。

<person> 
  <p1 id1="aaa"> 
    <name>zhangsan</name>  
    <age>50</age>  
    <sex>nv</sex> 
  </p1>  
</person>
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        Element root = document.getRootElement();
        Element p1 = root.element("p1");
        String s=p1.attributeValue("id1");
        System.out.println(s);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值