DOM解析

XML文档

 

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

<PhoneInfo name="小米">
    <Brand name="华为">
        <Type name="U8650"/>
        <Type name="HW123"/>
        <Type name="HW321"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone4"/>
    </Brand>
    <Brand name="小米"/>
</PhoneInfo>

 

 

编写java 对 XML增删改查

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
 * DOM解析
 * @author ZZH
 *
 */
public class Dom {
    //收藏信息XML对应的Document对象
    private Document document;
    
    
    /**
     *     获得DOM树,获得Document对象
     */
    public void getDom() {
        //获得解析器工厂
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        try {
            //根据解析工厂获取解析器
            DocumentBuilder builder=factory.newDocumentBuilder();
            
            //解析器来解析XML文件获得Document对象
            document = builder.parse("收藏信息.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取手机品牌及其型号
     */
    public void showInfo() {
        //以Document做起点,先拿到所有的Brand节点
        NodeList brands = document.getElementsByTagName("Brand");
        //遍历brands,从中拿出每一个Brand:手机品牌
        for(int i=0;i<brands.getLength();i++) {
            Node node=brands.item(i);
            Element eleBrand =(Element)node;
            System.out.println(eleBrand.getAttribute("name"));
            
            //查找每个Brand的子节点
            NodeList types = eleBrand.getChildNodes();
            //遍历types,从中拿出每一个types:手机型号
            for(int j=0;j<types.getLength();j++) {
                Node typeNode = types.item(j);
                if(typeNode.getNodeType() ==Node.ELEMENT_NODE) {        //如果是元素节点,判断节点是什么类型的
                    Element typeEle = (Element)typeNode;                //如果是元素节点,强转成元素节点
                    System.out.println("\t"+typeEle.getAttribute("name"));
                }
            }
        }
    }
    
    /**
     * 保存
     */
    public void saveXML(String site) {
        //转换器工厂
        TransformerFactory factory=TransformerFactory.newInstance();
        //格式:缩进4字节
        factory.setAttribute("indent-number",4);
        try {
            //转换器
            Transformer transformer =factory.newTransformer();
            //指定转换的格式
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");    //编码格式
            transformer.setOutputProperty(OutputKeys.INDENT,"YES");            //缩进开启
            //
            DOMSource source =new DOMSource(document);
            OutputStream out =new FileOutputStream(site);
            StreamResult result =new StreamResult(new OutputStreamWriter(out,"UTF-8"));
            transformer.transform(source, result);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        
    }
    
    /**
     * 为XML文件添加元素
     */
    public void addEle(String phone,String model) {
        //<Brand name="三星"/>
        Element brand = document.createElement("Brand");
        brand.setAttribute("name", phone);
        //<Type name="NOTE2"/>
        Element type=document.createElement("Type");
        type.setAttribute("name", model);
        //将Type作为Brand的子元素
        brand.appendChild(type);
        //获取文件的PhoneInfo目录集合.item方法(下标是0),再将Brand添加到它的子元素    
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
        
    }
    
    /**
     * 修改元素 加id
     */
    public void updateEle() {
        //获取所有brand
        NodeList brands =document.getElementsByTagName("Brand");
        for(int i=0;i<brands.getLength();i++) {
            Node brand = brands.item(i);
            Element brandELe =(Element)brand;
            brandELe.setAttribute("id",i+"");
        }
        saveXML("新收藏信息.xml");    //保存
    }
    
    /**
     * 删除元素
     */
    public void deleteEle(String phone) {
        //获取所有的Brand
        NodeList brands = document.getElementsByTagName("Brand");
        for(int i=0;i<brands.getLength();i++) {
            Node brand = brands.item(i);
            Element brandEle = (Element)brand;
            
            if(brandEle.getAttribute("name").equals(phone)) {
                brandEle.getParentNode().removeChild(brandEle);
            }
        }
        saveXML("新收藏信息.xml");    //保存
    }
    
    /**
     * main方法
     */
    public static void main(String[] args) {
        Dom dom=new Dom();            //创建XML对象
        dom.getDom();                 //获取Document对象
        dom.addEle("三星","NOTE2");    //添加手机
        dom.saveXML("新收藏信息.xml");    //保存信息
        dom.deleteEle("华为");        //删除手机
        dom.showInfo();                //展示信息
    }
}

 

运行前

 

运行后

 

 

posted @ 2019-03-13 01:03  纸灰  阅读(148)  评论(0编辑  收藏  举报