dom4j解析xml;
*查询所有name元素里面的值
1、创建解析器
2、得到document
3、得到所有的p1标签
element(qname)获取标签下面的第一个子标签   qname:标签名称
elements(qname)获取标签下面的所有子标签(一层)
elements()获取标签下面的所有一层子标签
4、得到name
5、得到name里面的值
*dom4j支持xpath的操作
1、直接获取到某个元素
2、第一种形式 /aaa/ddd/ccc :表示得到一层中的aaa下的ddd下的ccc元素
3、第二种形式//aaa:表示只要是aaa都得到
3、第三种形式/*:得到所有标签
4、第四种形式/aaa/ddd[1]:表示aaa下面第一个ddd元素       /aaa[last()]:表示最后一个aaa标签
5、第五种形式://aaa[@id] :得到所有有id属性的aaa标签
6、第六种形式://aaa[@name='user']得到所有name属性值为user的aaa标签

<?xml version="1.0" encoding="UTF-8"?>

<person> 
  <p1 id='person'> 
    <name>张三</name>  
    <sex>nan</sex>  
    <sex>nan</sex>  
    <sex>nan</sex> 
  </p1>  
  <school>三中</school>  
  <school>三中</school>  
  <p1> 
    <name>李四</name>  
    <age>24</age> 
  </p1>  
  <p1> 
    <name>王五</name>  
    <age>25</age> 
  </p1> 
</person>
package cn.code.dom4j;

import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import cn.code.dom4jUtils.Dom4jUtils;

/**
 * dom4j不是javase的一部分,需要先导包;
 * Dom4j会先创建一个dom树,然后逐行解析,sax,dom集于一身,所以可以实现增删改查;
 * SAXReeader解析器 是类可以直接new
 * Document是xml文档对象 是接口父接口是Nodes
 * getRootElements();返回根节点,返回值是Element类型,Element是Nodes的子接口;
 * */
public class Dom4j_01 {
    @Test
    public void test1()throws Exception{
        SAXReader r = new SAXReader();
        Document d = r.read("src/cn/code/dom4j/Person.xml");
        Element root = d.getRootElement();
        List<Element>list = root.elements("p1");
        for(Element p1:list){
            Element name = p1.element("name");
            String s =name.getText();
            System.out.println(s);
        }
    }
    @Test
    //在p1标签末尾添加标签
    public void test2()throws Exception{
        SAXReader r = new SAXReader();
        Document d = r.read("src/cn/code/dom4j/Person.xml");
        Element root = d.getRootElement();
        Element p1 = root.element("p1");
        Element sex = p1.addElement("sex");
         sex.setText("nan");
         OutputFormat format = OutputFormat.createPrettyPrint();
         XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/cn/code/dom4j/Person.xml"),format);
         xmlwriter.write(d);
         xmlwriter.close();
    }
    //在任意位置创建标签
    @Test
    public void test3()throws Exception{
        SAXReader r = new SAXReader();
        Document d = r.read("src/cn/code/dom4j/Person.xml");
        Element root = d.getRootElement();
        Element p1 = root.element("p1");
        //创建school标签
        Element school = DocumentHelper.createElement("school");
        school.setText("三中");
        List<Element> list = p1.elements();
        list.add(1, school);
        //回写xml
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/cn/code/dom4j/Person.xml"),format);
        xmlwriter.write(d);
        xmlwriter.close();
    }
    //修改指定标签内容
    @Test
    public void test4()throws Exception{
        Document d = Dom4jUtils.getDocument("src/cn/code/dom4j/Person.xml");
        Element root =d.getRootElement();
        Element p1 = root.element("p1");
        Element age = p1.element("age");
        age.setText("22");
        Dom4jUtils.xmlWriterBack("src/cn/code/dom4j/Person.xml", d);
    }
    @Test
    //删除指定标签
    public void test5(){
        Document d = Dom4jUtils.getDocument("src/cn/code/dom4j/Person.xml");
        Element p1= d.getRootElement().element("p1");
        Element age = p1.element("age");
        p1.remove(age);
        Dom4jUtils.xmlWriterBack("src/cn/code/dom4j/Person.xml", d);
    }
    @Test
    public void  test6(){
        Document d = Dom4jUtils.getDocument("src/cn/code/dom4j/Person.xml");
        Element p1 = d.getRootElement().element("p1");
        //获取属性值
        String s = p1.attributeValue("id");
        System.out.println(s);
    }
    //使用xpath完成定位标签以及属性
    @Test
    public void test7(){
        Document d = Dom4jUtils.getDocument("src/cn/code/dom4j/Person.xml");
        List<Node> list = d.selectNodes("//p1/name");
        for (Node node : list) {
            String s = node.getText();
            System.out.println(s);
        }
    }
    @Test
    public void test8(){
        Document d = Dom4jUtils.getDocument("src/cn/code/dom4j/Person.xml");
        Node name = d.selectSingleNode("//p1[@id='person']/name");
        String s = name.getText();
        System.out.println(s);
    }
}

工具类

package cn.code.dom4jUtils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

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

public class Dom4jUtils {
    public static Document getDocument(String path){
        //获取解析器
        SAXReader r = new SAXReader();
        try {
            Document d = r.read(path);
            return d;
        } catch (DocumentException e) {
            throw new RuntimeException();
        }
    }
    public static void xmlWriterBack(String path,Document document) {
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlwriter = null;
        try {
             xmlwriter = new XMLWriter(new FileOutputStream(path),format);
            xmlwriter.write(document);
            
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                xmlwriter.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

 

package cn.itcast.dom4j;

import java.io.FileOutputStream;
import java.io.IOException;
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 TestDom4j {

    public static void main(String[] args) throws DocumentException, IOException,Exception {
//        selectFirstNameValue();
//        insertElement();
//        insertElement_2();
//        modifyElementText();
//        removeElement();
        getAttributeValue();
    }
    public static void getAttributeValue()throws Exception {
        // 获取name id属性的值
        SAXReader sax = new SAXReader();
        Document document = sax.read("src/person.xml");
        Element root = document.getRootElement();
        Element p1 = root.element("p1");
        Element name = p1.element("name");
        String str = name.attributeValue("id");
        System.out.println(str);
    }
    public static void removeElement() throws DocumentException ,Exception{
        // 删除第一个p1下的school节点
        SAXReader sax = new SAXReader();
        Document document = sax.read("src/person.xml");
        Element root = document.getRootElement();
        Element p1 = root.element("p1");
        Element school = root.element("p1").element("school");
        //通过父节点删除school节点
        p1.remove(school);
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/person.xml"),format);
        xmlwriter.write(document);
        xmlwriter.close();
    }
    public static void modifyElementText() throws DocumentException, IOException {
        // TODO Auto-generated method stub
        SAXReader sax = new SAXReader();
        Document document = sax.read("src/person.xml");
        Element root = document.getRootElement();
        root.element("p1").element("age").setText("30");
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/person.xml"),format);
        xmlwriter.write(document);
        xmlwriter.close();
    }
    public static void insertElement_2() throws DocumentException, IOException {
        // 特定位置插入节点
        SAXReader sax = new SAXReader();
        Document document = sax.read("src/person.xml");
        Element root = document.getRootElement();
        List<Element> e = root.element("p1").elements();
        //创建school元素
        Element school = DocumentHelper.createElement("school");
        //添加文本内容
        school.setText("三中");
        e.add(1, school);
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlwriter = new XMLWriter(new FileOutputStream("src/person.xml"),format);
        xmlwriter.write(document);
        xmlwriter.close();
    }
    public static void insertElement() throws DocumentException, IOException {
        // TODO Auto-generated method stub
        SAXReader sax = new SAXReader();
        Document document = sax.read("src/person.xml");
        Element root = document.getRootElement();
        Element sex = root.element("p1").addElement("sex");
        sex.setText("gril");
        //回写
        OutputFormat format = OutputFormat.createPrettyPrint();//漂亮的格式
        XMLWriter xmlwriter =  new XMLWriter(new FileOutputStream("src/person.xml"),format);
        xmlwriter.write(document);
        xmlwriter.close();
    }
    public static void selectNameValue() throws DocumentException{
                //创建解析器
                SAXReader saxReader = new SAXReader();
                //得到document
                Document  document = saxReader.read("src/person.xml");
                //得到根节点
                Element root  = document.getRootElement();
                //得到p1
                List<Element> p1 = root.elements("p1");
                //遍历p1得到下面的name
                for(Element  element : p1){
                    String str =element.element("name").getText();
                    System.out.println(str);
                }
    }
    public static void selectFirstNameValue() throws DocumentException{
        SAXReader  sr = new SAXReader();
        Document document = sr.read("src/person.xml");
        String str = document.getRootElement().element("p1").element("name").getText();
        System.out.println(str);
    }

}