XML

简介

  

文档结构

  

XML组成

  

标签编写注意事项

  

转义符

  

解析XML技术

  

使用DOM解析XML

  

  

    public void loadDocument() {
        // 1、创建解析器工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 2、从解析器工厂实例中获取一个解析器实例
        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3、解析XML文件,得到DOM树
            doc = builder.parse("收藏信息.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
加载DOM树

 解析XML文件

  

    public void showInfo() {
        // 1、获取所有brand
        NodeList brandList = doc.getElementsByTagName("Brand");
        // 2、遍历所有的brand标签
        for (int i = 0; i < brandList.getLength(); i++) {
            Node brandNode = brandList.item(i);
            Element brandEle = (Element) brandNode;
            String brandStr = brandEle.getAttribute("name");
            // 获取brand的所有子节点
            NodeList typeList = brandEle.getChildNodes();
            // 遍历所有type标签
            for (int j = 0; j < typeList.getLength(); j++) {
                Node typeNode = typeList.item(j);
                // 如果当前Node是一个Element,则进行转换
                if (typeNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element typeEle = (Element) typeNode;
                    // 获取此Element的Name属性值
                    String typeStr = typeEle.getAttribute("name");
                    System.out.println("手机品牌:" + brandStr + ",型号" + typeStr);
                }
            }
        }
    }
解析XML文件

 保存XML文件

  

    public void saveXML(String path) {
        // 1、创建一个转换工厂
        TransformerFactory factory = TransformerFactory.newInstance();
        // 2、使用转换工厂创建一个转换器
        try {
            Transformer former = factory.newTransformer();
            // 设置转换器的编码格式
            former.setOutputProperty(OutputKeys.ENCODING, "gb2312");
            // 3、进行转换 源(DOM树)——>目标(XML文件)
            Source xmlSource = new DOMSource(doc);
            Result outputTarget = new StreamResult(path);
            former.transform(xmlSource, outputTarget);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
保存XML文件

 添加DOM节点

  

    public void addNewPhoneInfo() {
        // 1、创建一个brand节点
        Element newBrand = doc.createElement("Brand");
        newBrand.setAttribute("name", "三星");
        // 2、创建一个type节点
        Element newType = doc.createElement("type");
        newType.setAttribute("name", "Note4");
        // 3、将type节点作为brand的子节点
        newBrand.appendChild(newType);
        // 4、将brand挂到DOM树
        doc.getElementsByTagName("PhoneInfo").item(0).appendChild(newBrand);
    }
添加DOM节点

 修改/删除DOM节点

  

    public void modifyPhoneInfo() {
        // 1、找到name值为三星的brand节点
        NodeList brandList = doc.getElementsByTagName("Brand");
        for (int i = 0; i < brandList.getLength(); i++) {
            Node brandNode = brandList.item(i);
            Element brandEle = (Element) brandNode;
            if (brandEle.getAttribute("name").equals("三星")) {
                // 2、修改节点的name属性值
                brandEle.setAttribute("name", "SAMSUNG");
            }
        }
    }
修改DOM节点
    public void delPhoneInfo() {
        // 1、找到name值为三星的brand节点
        NodeList brandList = doc.getElementsByTagName("Brand");
        for (int i = 0; i < brandList.getLength(); i++) {
            Node brandNode = brandList.item(i);
            Element brandEle = (Element) brandNode;
            if (brandEle.getAttribute("name").equals("SAMSUNG")) {
                // 2、使用这个节点的父节点来删除它
                brandEle.getParentNode().removeChild(brandEle);
            }
        }
    }
删除DOM节点 

使用DOM4J解析XML

  

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

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 TestDOM4J {
    Document doc = null;

    /**
     * 加载DOM树
     */
    public void loadDocument() {
        SAXReader saxReader = new SAXReader();
        try {
            doc = saxReader.read("收藏信息.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 显示所有信息
     */
    public void showInfo() {
        Element root = doc.getRootElement();
        Iterator itBrand = root.elementIterator();
        while (itBrand.hasNext()) {
            Element brandEle = (Element) itBrand.next();
            String brandStr = brandEle.attributeValue("name");
            Iterator itType = brandEle.elementIterator();
            while (itType.hasNext()) {
                Element typeEle = (Element) itType.next();
                String typeStr = typeEle.attributeValue("name");
                System.out.println("手机品牌:" + brandStr + ",型号:" + typeStr);

            }
        }
    }

    /**
     * 保存XML
     */
    public void saveXML(String path) {
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        try {
            XMLWriter writer = new XMLWriter(new FileWriter(path), format);
            writer.write(doc);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 添加一个节点
     */
    public void addPhoneInfo() {
        Element root = doc.getRootElement();
        // 创建一个brand节点
        Element brandEle = root.addElement("Brand");
        // 给Brand节点设置属性
        brandEle.addAttribute("name", "三星");
        // 创建Type节点
        Element typeEle = brandEle.addElement("Type");
        typeEle.addAttribute("name", "Note4");
        this.saveXML("新的收藏信息.xml");
    }

    /**
     * 修改节点信息
     */
    public void modifyPhoneInfo() {
        Element root = doc.getRootElement();
        int id = 0;
        Iterator itBrand = root.elementIterator();
        // 遍历后获取每个brand节点
        while (itBrand.hasNext()) {
            id++;
            Element brandEle = (Element) itBrand.next();
            brandEle.addAttribute("id", id + "");
        }
        this.saveXML("新的收藏信息.xml");
    }

    /**
     * 删除节点信息
     */
    public void delPhoneInfo() {
        Element root = doc.getRootElement();
        Iterator itBrand = root.elementIterator();
        while (itBrand.hasNext()) {
            Element brandEle = (Element) itBrand.next();
            if (brandEle.attributeValue("name").equals("三星")) {
                brandEle.getParent().remove(brandEle);
            }
        }
        this.saveXML("新的收藏信息.xml");
    }

    public static void main(String[] args) {
        TestDOM4J parse = new TestDOM4J();
        parse.loadDocument();
        parse.saveXML("新的收藏信息.xml");
        parse.addPhoneInfo();
        parse.modifyPhoneInfo();
        parse.delPhoneInfo();
        parse.showInfo();
    }
}
使用DOM4J解析XML
原文地址:https://www.cnblogs.com/xhddbky/p/9175160.html