这里写目录标题

  • XML概念
  • 简介
  • 作用
  • XML使用
  • 基本操作
  • 解析xml文件


XML概念

简介

  1. XML全称:eXtensible Markup Language。是一个可扩展标记语言
  2. 操作使用类似于HTML,但是他更加灵活,没有固定的使用标签,都是自定义标签

作用

  1. 数据存储:XML与数据库一样,可以实现数据的持久化存储;并且 它格外简单
  2. 数据交换:它与操作系统无关,类似于txt文档,因此常用于记录 和传递信息。比如:国家气象部门发布的天气信息,就是以xml格式存储,这样 不论是什么系统的计算机、什么系统的手机、什么软件、什么网站都可以直接读 取到这些信息。
  3. 配置文件:很多网站和应用程序的配置文件;

XML使用

基本操作

直接编写xml文件

`<?xml version="1.0" encoding="UTF-8"?>
<ClothesSize>
    <size height="身高<165">S</size>
    <size height="165<身高<170">M</size>
    <size height="170<身高<175">L</size>
    <size height="175<身高<180">XL</size>
    <size height="180<身高<185">XXL</size>
</ClothesSize>`

注意事项

  1. XML的声明要么不写,要么写在就写在第一行;
  2. 只能有一个根标签;
  3. 标签必须正确结束;
  4. 严格区分大小写;
  5. 标签不能以数字开头;
  6. 属性必须有值,且必须加引号;

解析xml文件

通常我们去通过xml编写的不多,大多是去解析xml,而不是像上面那样去编写

注意:路径一定正确,否则会报错

package com.ytzl.chapter06.demo.demo02;

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;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @program: Java高级特性Api
 * @description: 使用dom解析xml
 * @author: Mr.He
 * @create: 2022-05-07 09:44
 **/
public class DomParseXml {
    Document document = null;
    //获取dom树
    public void getDocument(){
        //1:创建解析器工厂对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            //2:解析器工厂对象创建解析器对象
            DocumentBuilder builder = factory.newDocumentBuilder();
            //3:解析器对象指定的xml文件创建document对象
            document = builder.parse("phoneInfo.xml");
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }
    }
    //4:以document对象为起点操作dom树
    //显示xml信息
    public void showXmlInfo(){
        //通过节点名获取节点
        NodeList nodeList = document.getElementsByTagName("Brand");
        //for遍历节点集合
        for (int i = 0; i < nodeList.getLength(); i++) {
            //通过item()获取每个节点
            Node node = nodeList.item(i);
            //将node节点转化成元素
            Element element = (Element) node;
            //通过获取节点属性获取属性值
            String name = element.getAttribute("name");
            //获取元素element的子元素
            NodeList childNodes = element.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node item = childNodes.item(j);
                //判断获取的节点是否为元素节点            (切换大小写:Ctrl+Shift+u)
                if (item.getNodeType()==Node.ELEMENT_NODE){
                    Element element1 = (Element) item;
                    String name1 = element1.getAttribute("name");
                    System.out.println("手机:"+name+"    型号:"+name1);
                }
            }
        }
    }
    //另存xml信息
    public void saveXmlInfo(){
        try {
            //保存步骤
            //1:获得TransformerFactory对象
            //创建转换工厂
            TransformerFactory factory = TransformerFactory.newInstance();
            //2:创建Transformer对象
            //创建转换解析器
            Transformer transformer = factory.newTransformer();
            //3:创建DOMSource对象
            //      包含XML信息
            DOMSource domSource = new DOMSource(document);
            //4:设置输出属性
            //              name      value
            //      编码格式:encoding--UTF-8
            transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
            // 5:创建StreamResult对象
            //      包含保存文件的信息
            StreamResult streamResult = new StreamResult(new FileOutputStream("NewPhoneInfo.xml"));
            //6:将XML保存到指定文件中
            transformer.transform(domSource,streamResult);

        } catch (TransformerConfigurationException | FileNotFoundException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
    //增加xml信息
    public void insertXmlInfo(){
        //创建元素节点
        Element brand = document.createElement("Brand");
        //设置元素节点的属性
        brand.setAttribute("name","VIVO");
        //创建元素节点
        Element type1 = document.createElement("type");
        //设置元素节点的属性
        type1.setAttribute("name","vivo x70");
        //创建元素节点
        Element type2 = document.createElement("type");
        //设置元素节点的属性
        type2.setAttribute("name","iqoo 855 pro");
        //创建元素节点
        Element type3 = document.createElement("type");
        //设置元素节点的属性
        type3.setAttribute("name","vivo y75s");
        //将type1元素节点追加到brand元素节点里
        brand.appendChild(type1);
        //将type2元素节点追加到brand元素节点里
        brand.appendChild(type2);
        //将type3元素节点追加到brand元素节点里
        brand.appendChild(type3);
        //获取根节点
        Element phoneInfo = (Element) document.getElementsByTagName("PhoneInfo").item(0);
        //将brand元素节点追加到phoneInfo元素节点里
        phoneInfo.appendChild(brand);
    }
    //删除xml信息
    public void deleteXmlInfo(){
        NodeList brand = document.getElementsByTagName("Brand");
        for (int i = 0; i < brand.getLength(); i++) {
            Node item = brand.item(i);
            Element element = (Element) item;
            if (element.getAttribute("name").equals("苹果")){
                element.getParentNode().removeChild(element);
            }
        }
    }
    //修改xml信息
    public void updateXmlInfo(){
        NodeList brand = document.getElementsByTagName("Brand");
        for (int i = 0; i < brand.getLength(); i++) {
            Node item = brand.item(i);
            Element element = (Element) item;
            if (element.getAttribute("name").equals("华为")){
                element.setAttribute("name","OPPO");
            }

        }
    }

    public static void main(String[] args) {
        DomParseXml domParseXml = new DomParseXml();
        //获取document对象
        domParseXml.getDocument();
        //增加xml信息
        domParseXml.insertXmlInfo();
        //删除xml信息
        domParseXml.deleteXmlInfo();
        //修改xml信息
        domParseXml.updateXmlInfo();
        //展示解析后的xml信息
        domParseXml.showXmlInfo();
        //另存为xml信息
        domParseXml.saveXmlInfo();
    }
}