JAVA高级特性——DOM4J解析XML

 

DOM4J

导包

在工程路径下创建lib文件夹,将DOM4J.jar包放到lib文件夹下,右键DOM4J.jar包,选择Build path -Add to Build Path 与工程绑定

 

 

 

 

 

Document:定义XML文档

Element:定义XML元素

Text:定义XML文本节点(DOM使用.getNodeType()判断)

Attribute:定义XML属性

具体API文档:http://tool.oschina.net/apidocs/apidoc?api=dom4j1.6.1%2Fapidocs

 

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
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 Dom4j {
    private Document document;
    
    /**
     * 获得DOM对象
     */
    public void getDom() {
        //通过SAXReader(一种流的形式)读取文件
        SAXReader reader=new SAXReader();
        try {
            //通过read()方法将读取的文件放到document中
            document=reader.read(new File("phone.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 显示所有信息
     */
    public void showInfo() {
        //先获得根节点
        Element root=document.getRootElement();
        /*//迭代器获得根节点下的所有Brand
        Iterator eleBrands=root.elementIterator();
        while(eleBrands.hasNext()) {
            
            //将每一个取到的eleBrans转化成元素节点
            Element eleBrand=(Element)eleBrands.next();
            System.out.println(eleBrand.attributeValue("name"));
            
            //迭代器获得当前Brand下的所有Type元素
            Iterator eleTypes=eleBrand.elementIterator();
            while(eleTypes.hasNext()) {
                Element eleType=(Element)eleTypes.next();
                System.out.println("\t"+eleType.attributeValue("name"));
            }
        }*/
        
        //使用集合输出所有节点信息
        //创建一个集合接收根节点下的所有Brand
        List <Element> eleBrands=root.elements();
        //遍历Brands,输出每一个Brand的name属性的值
        for (Element eleBrand : eleBrands) {
            System.out.println(eleBrand.attributeValue("name"));
            //再创建一个集合接收每一个Brand下的所有Type
            List <Element> Types=eleBrand.elements();
            //遍历Types,输出每一个Type的name属性的值
            for (Element eleType : Types) {
                System.out.println(eleType.attributeValue("name"));
            }
            
        }
    }
    
    /**
     * 增加信息
     */
    public void addDom() {
        //获得根元素
        Element root=document.getRootElement();
        //再根元素下创建元素名为Brand的元素
        Element eleBrand=root.addElement("Brand");
        eleBrand.addAttribute("name", "Vivo");
        
        Element eleType=eleBrand.addElement("name");
        eleType.addAttribute("name", "s27");
    }
    
    /**
     * Brand元素增加id属性
     */
    public void update() {
        Element root=document.getRootElement();
        Iterator eleBrands=root.elementIterator();
        int id=0;
        while(eleBrands.hasNext()) {    
            //将每一个取到的eleBrans转化成元素节点
            Element eleBrand=(Element)eleBrands.next();
            id++;
            eleBrand.addAttribute("id", id+"");
        }
    }
    
    
    /**
     * 删除元素节点
     */
    public void delete() {
        Element root=document.getRootElement();
        Iterator eleBrands=root.elementIterator();
        while(eleBrands.hasNext()) {    
            //将每一个取到的eleBrans转化成元素节点
            Element eleBrand=(Element)eleBrands.next();
            if(eleBrand.attributeValue("name").equals("三星")) {
                eleBrand.getParent().remove(eleBrand);
            }
            
        }
    }
    
    /**
    保存文件
     * @param path
     */
    public void save(String path) {
        //相当于DOM的转换器,以createPrettyPrint()输出
        OutputFormat format=OutputFormat.createPrettyPrint();
        //可以用setEncoding()方法设定保存编码
        //format.setEncoding("UTF-8");
        try {
            //保存到path路径文件去,以format这种形式
            XMLWriter writer=new XMLWriter(new FileOutputStream(path),format);
            //直接将document写入
            writer.write(document);
            
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {

            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    
    
    
    
    
    
    public static void main(String[] args) {
        Dom4j dom4j=new Dom4j();
        dom4j.getDom();
        //dom4j.addDom();
        //dom4j.update();
        //dom4j.delete();
        //dom4j.save("phone1.xml");
        dom4j.showInfo();
    }
    
     
}

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PhoneInfo>
    <Brand id="0" name="华为">
    234234
        <Type name="u920"/>
        <Type name="4112"/>
        <Type name="970"/>
    </Brand>
    <Brand id="1" name="苹果">
        <Type name="i8"/>
        <Type name="xs"/>
        <Type name="xr"/>
    </Brand>


<Brand name="三星">
<Type name="note3"/>
</Brand>
</PhoneInfo>

 

DOM4J是DOM解析的进一步封装,使用更简洁,获得节点的元素或者属性可以使用迭代器,也可以使用elements()方法获取集合,遍历操作。

 

posted on 2018-12-26 14:48  易失眠  阅读(233)  评论(0)    收藏  举报

导航