zoukankan      html  css  js  c++  java
  • 使用DOM解析XML文件,读取xml文件,保存xml,增加节点,修改节点属性,删除节点

    <?xml version="1.0" encoding="GB2312" ?>
    <PhoneInfo>
    <Brand name="华为">
        <Type name="P9"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iphone5"/>
        <Type name="iphone6"/>
    </Brand>
    </PhoneInfo>

    0、整体代码

    package test;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    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.Result;
    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.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class XmlTest {
    
        Document doc = null;// 创建一个Document对象
    
        public static void main(String[] args) {
            XmlTest xml = new XmlTest();
            xml.getDocument();
            xml.creatNode();
            xml.changeType();
            xml.showInfo();
            xml.deleteNode("SAMSUNG");
            xml.showInfo();
            xml.saveXml("D:/xml.xml");
    
        }
    
        /**
         * 获得DOM树 
         * 
         */
        public void getDocument() {
            // 1、得到DOM工厂解析器工厂实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    
            try {
                // 2、从DOM工厂中获得Dom解析器
                DocumentBuilder db = factory.newDocumentBuilder();
                // 3、解析XML文件获得Document对象,即DOM树
                doc = db.parse("收藏信息.xml");
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException | IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
        /**
         * 显示xml文档信息 !
         */
        public void showInfo() {
            // 获取DOM树Brand节点
            NodeList BrandName = doc.getElementsByTagName("Brand");
            for (int i = 0; i < BrandName.getLength(); i++) {
                // 获取第i个Brand元素的信息(返回i元素)
                Node brand = BrandName.item(i);
                // Element是Node的子类,用Element的getAttribute("属性名")获得元素属性
                Element element = (Element) brand;
                // 获取第i个Brand元素的name属性
                String brandAttribute = element.getAttribute("name");
                // 获得所有的子节点
                NodeList types = element.getChildNodes();
                for (int j = 0; j < types.getLength(); j++) {
                    Node type = types.item(j);
                    // 判断是否是元素节点(使用getChildNodes()就要判断)
                    if (type.getNodeType() == Node.ELEMENT_NODE) {
                        Element typeEle = (Element) type;
                        String typeAttribute = typeEle.getAttribute("name");
                        System.out.println("手机:" + brandAttribute + typeAttribute);
                    }
                }
    
            }
        }
    
        /**
         * 新增节点
         * 
         */
        public void creatNode() {
            // 创建三星节点
            Element brandEle = doc.createElement("Brand");
            brandEle.setAttribute("name", "三星");
            // 创建型号Note7节点
            Element type = doc.createElement("Type");
            type.setAttribute("name", "Note7");
            // 把note7元素挂到三星元素上
            brandEle.appendChild(type);
            // 找到PhoneInfo节点
            NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo");
            for (int i = 0; i < PhoneInfosNode.getLength(); i++) {
                Node PhoneInfos = PhoneInfosNode.item(i);
                if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) {
                    // 把三星节点挂到PhoneInfo上
                    PhoneInfos.appendChild(brandEle);
                }
    
            }
    
        }
        /**
         * 保存xml文档
         *
         * @param path 保存的路径
         */
        public void saveXml(String path) {
            // 1、创建转换工厂
            TransformerFactory factory = TransformerFactory.newInstance();
    
            try {
                // 2、从工厂中获得转换器
                Transformer Transformer = factory.newTransformer();
                // 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置
                // 输出文件编码格式设置
                Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
                // 需要DOM转换的源文件
                DOMSource xmlSource = new DOMSource(doc);
                // 指定目标路径
                StreamResult outputTarget = new StreamResult(new FileOutputStream(
                        path));
                // 使用transform()进行保存xml文件
                Transformer.transform(xmlSource, outputTarget);
    
            } catch (TransformerConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TransformerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
        /**
         * 更改Brand属性
         *
         */
        public void changeType(){
            //获得节点信息
            NodeList brandElements = doc.getElementsByTagName("Brand");
            //遍历节点
            for (int i = 0; i < brandElements.getLength(); i++) {
                Node brands = brandElements.item(i);
                Element brand=(Element) brands;
                
                String brandAtt = brand.getAttribute("name");
                //判断节点属性值
                if(brandAtt.equals("三星")){
                    brand.setAttribute("name", "SAMSUNG");
                }
            }
        }
        /**
         * 删除指定节点
         * @param name 删除的Brand属性名
         */
        public void deleteNode(String name){
            NodeList brandsEle = doc.getElementsByTagName("Brand");
            for (int i = 0; i < brandsEle.getLength(); i++) {
                Element brand = (Element) brandsEle.item(i);
                String brandAttribute = brand.getAttribute("name");
                if(brandAttribute.equals(name)){
                    doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand);
                }
                
            }
        }
    }

     1、通过DocumentBuilderFactory 获得解析工厂,在工厂中获得解析器实例,通过解析器获得DOM树。

        /**
         * 获得DOM树 
         * 
         */
        public void getDocument() {
            // 1、得到DOM工厂解析器工厂实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    
            try {
                // 2、从DOM工厂中获得Dom解析器
                DocumentBuilder db = factory.newDocumentBuilder();
                // 3、解析XML文件获得Document对象,即DOM树
                doc = db.parse("收藏信息.xml");
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException | IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }

    2、保存xml文件

    /**
         * 保存xml文档
         *
         * @param path 保存的路径
         */
        public void saveXml(String path) {
            // 1、创建转换工厂
            TransformerFactory factory = TransformerFactory.newInstance();
    
            try {
                // 2、从工厂中获得转换器
                Transformer Transformer = factory.newTransformer();
                // 3、进行转换,如果直接转换可能出现乱码,需要进行格式设置
                // 输出文件编码格式设置
                Transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
                // 需要DOM转换的源文件
                DOMSource xmlSource = new DOMSource(doc);
                // 指定目标路径
                StreamResult outputTarget = new StreamResult(new FileOutputStream(
                        path));
                // 使用transform()进行保存xml文件
                Transformer.transform(xmlSource, outputTarget);
    
            } catch (TransformerConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TransformerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }

    3、xml文件显示到控制台

    /**
         * 显示xml文档信息 !
         */
        public void showInfo() {
            // 获取DOM树Brand节点
            NodeList BrandName = doc.getElementsByTagName("Brand");
            for (int i = 0; i < BrandName.getLength(); i++) {
                // 获取第i个Brand元素的信息(返回i元素)
                Node brand = BrandName.item(i);
                // Element是Node的子类,用Element的getAttribute("属性名")获得元素属性
                Element element = (Element) brand;
                // 获取第i个Brand元素的name属性
                String brandAttribute = element.getAttribute("name");
                // 获得所有的子节点
                NodeList types = element.getChildNodes();
                for (int j = 0; j < types.getLength(); j++) {
                    Node type = types.item(j);
                    // 判断是否是元素节点(使用getChildNodes()就要判断)
                    if (type.getNodeType() == Node.ELEMENT_NODE) {
                        Element typeEle = (Element) type;
                        String typeAttribute = typeEle.getAttribute("name");
                        System.out.println("手机:" + brandAttribute + typeAttribute);
                    }
                }
    
            }
        }

    4、添加节点Brand:三星,Type:note7

    /**
         * 新增节点
         * 
         */
        public void creatNode() {
            // 创建三星节点
            Element brandEle = doc.createElement("Brand");
            brandEle.setAttribute("name", "三星");
            // 创建型号Note7节点
            Element type = doc.createElement("Type");
            type.setAttribute("name", "Note7");
            // 把note7元素挂到三星元素上
            brandEle.appendChild(type);
            // 找到PhoneInfo节点
            NodeList PhoneInfosNode = doc.getElementsByTagName("PhoneInfo");
            for (int i = 0; i < PhoneInfosNode.getLength(); i++) {
                Node PhoneInfos = PhoneInfosNode.item(i);
                if (PhoneInfos.getNodeType() == Node.ELEMENT_NODE) {
                    // 把三星节点挂到PhoneInfo上
                    PhoneInfos.appendChild(brandEle);
                }
    
            }
    
        }

    5、修改节点属性,修改"三星"为"SAMSUNG"

    /**
         * 更改Brand属性
         *
         */
        public void changeType(){
            //获得节点信息
            NodeList brandElements = doc.getElementsByTagName("Brand");
            //遍历节点
            for (int i = 0; i < brandElements.getLength(); i++) {
                Node brands = brandElements.item(i);
                Element brand=(Element) brands;
                
                String brandAtt = brand.getAttribute("name");
                //判断节点属性值
                if(brandAtt.equals("三星")){
                    brand.setAttribute("name", "SAMSUNG");
                }
            }
        }

    6、删除SAMSUNG节点

    /**
         * 删除指定节点
         * @param name 删除的Brand属性名
         */
        public void deleteNode(String name){
            NodeList brandsEle = doc.getElementsByTagName("Brand");
            for (int i = 0; i < brandsEle.getLength(); i++) {
                Element brand = (Element) brandsEle.item(i);
                String brandAttribute = brand.getAttribute("name");
                if(brandAttribute.equals(name)){
                    doc.getElementsByTagName("PhoneInfo").item(0).removeChild(brand);
                }
                
            }
        }

    7、主方法

    public static void main(String[] args) {
            XmlTest xml = new XmlTest();
            xml.getDocument();
            xml.creatNode();
            xml.changeType();
            xml.showInfo();
            xml.deleteNode("SAMSUNG");
            xml.showInfo();
            xml.saveXml("D:/xml.xml");
    
        }
  • 相关阅读:
    eclipse中常用快捷键
    js sort排序
    js parseInt函数
    Jquery常用方法
    jquery的call()和apply()方法
    Jquery中的事件命名机制
    CSS层叠样式表
    推荐博客园中好的博客主
    页面刷新或者子窗体刷新父窗体,不提示 "重试或取消”对话框
    FullCalendar日历插件使用说明
  • 原文地址:https://www.cnblogs.com/binglong180/p/7510672.html
Copyright © 2011-2022 走看看