码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA高级特性——DOM解析XML

时间:2018-12-19 17:55:51      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:tno   []   out   code   ace   put   not   form   dem   

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

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;

public class Demo {
    private Document document;

    /**
     * 获得DOM树,分三步,第一步,获得解析器工厂。第二步,根据解析器工厂获得解析器。第三步,解析器解析XML文件获得Document对象
     */
    public void getDom() {
        //获得解析器工厂
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        try {
            //获得解析器
            DocumentBuilder builder=factory.newDocumentBuilder();
            //获取对象
                document=builder.parse("phone.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取xml文件的所有元素结点
     */
    public void showInfo() {
        //根据节点名字找到节点Brand,返回一个NodeList集合
        NodeList brands = document.getElementsByTagName("Brand");
        //遍历Brand,拿到每一个Brand的Node节点,
        for(int i=0;i<brands.getLength();i++) {
            Node node = brands.item(i);
            //将Node节点转为元素节点
            Element eleBrand=(Element)node;
            //根据属性获得值
            System.out.println(eleBrand.getAttribute("name"));
            
            //找出当前Brands下的孩子节点
            NodeList types = eleBrand.getChildNodes();
            for(int j=0;j<types.getLength();j++) {
                Node typeNode=types.item(j);
                //判断当前Node节点是否元素节点
                if(typeNode.getNodeType()==Node.ELEMENT_NODE) {
                    Element eleType=(Element)typeNode;
                    System.out.println("\t"+eleType.getAttribute("name"));
                }
                
                
            }
        }
    }
    
    /**
     * 增加元素
     */
    public void addElement() {
        //创建Brand 元素
        Element brand=document.createElement("Brand");
        //设置Brand元素的属性
        brand.setAttribute("name", "三星");
        //创建Type元素
        Element type =document.createElement("Type");
        //设置Type元素的属性
        type.setAttribute("name", "note3");
        //将Type元素弄成Brand的子元素
        brand.appendChild(type);
        //将Brand放到根元素PhoneInfo里面去,
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);
        save();
    }
    
    /**
     * 修改Brand元素,增加一个id属性
     */
    public void updateEle() {
        //拿到所有Brand元素
        NodeList brands =document.getElementsByTagName("Brand");
        //遍历,转换成元素节点
        for(int i=0;i<brands.getLength();i++) {
            Element elebrand=(Element)brands.item(i);
            //通过setAttribute方法增加id属性
            elebrand.setAttribute("id", i+"");
            save();
        }
    }
    
    /**
     * 删除元素
     */
    public void deleteEle() {
        
        NodeList brands =document.getElementsByTagName("Brand");
        for(int i=0;i<brands.getLength();i++) {
            Element elebrand=(Element)brands.item(i);
            //判断当前元素name属性是等于三星的话,就执行
            if(elebrand.getAttribute("name").equals("三星")) {
                //getParentNode拿到当前节点的父亲节点再使用removeChild删除。
                elebrand.getParentNode().removeChild(elebrand);
            }
        }
        save();
    }
    
    /**
     * 保存xml文件,需要转换器,将Dom数转化为文档文件。
     */
    public void save() {
        //首先创建转换器工厂
        TransformerFactory factory=TransformerFactory.newInstance();
        //设置缩进
        factory.setAttribute("indent-number", 4);
        try {
            //通过转换器工厂获得转换器
            Transformer former=factory.newTransformer();
            //允许缩进
            former.setOutputProperty(OutputKeys.INDENT, "YES");
            
            //创建源
            DOMSource source=new DOMSource(document);
            //创建保存的目的地,用输出流
            OutputStream out=new FileOutputStream("phone.xml");        
            StreamResult result=new StreamResult(out);
            
            //转换器需要两个参数,一个是源,一个是目的地
            former.transform(source, result);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        
    }


    public static void main(String[] args) {
        Demo demo=new Demo();
        demo.getDom();
        demo.updateEle();
        demo.addElement();
        demo.deleteEle();
        demo.showInfo();
    }
}

 

 

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

 

JAVA高级特性——DOM解析XML

标签:tno   []   out   code   ace   put   not   form   dem   

原文地址:https://www.cnblogs.com/EasyInsomnia/p/10144641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!