JAVA第二阶段第十二天 XML & HTTP

这篇博客详细介绍了XML和HTTP的基础知识,包括XML的作用、书写规范、DOM和DOM4j解析,以及HTTP协议的概述、版本和请求响应协议。此外,还提到了Java中的反射和代码运行的三个阶段。
摘要由CSDN通过智能技术生成

XML

HTML 概述

html:是超文本标记语言,预定的一些标签,不需要编译,直接是由浏览器进行解析,标签不能自己随便定义

XML 概述

可扩展标记语言(标签),官方没有给标签定义好规范,就是自定义标签

XML 的作用

1.配置文件
2.存储数据(数据库)
3.前后端传递数据(json)

XML 的书写规范

1.名称不能以数字或者标点符号开始
2.名称不能包含空格
3.文档必须有根元素,而且仅有一对根元素
4.标签区分大小写

XML 的组成部分

1.xml 的声明:<?xml version='1.0' encoding='UTF-8'?>
==>>xml 的版本:version=‘1.0’ (最新版本是1.1)
==>>xml 编码格式:encoding=‘UTF-8’
2.元素:html中的标签 例如:
3.属性: 比如id属性
4. <![CDATA ]:表示忽略特殊符号
5.注释:和 html 中的注释一样

XML 的特点

1.不会编译,有浏览器直接解析
2.只能存在一个根标签
3.元素一般都是成对的,也有单个的
4.区别大小写
5.后缀名是.xml

XML 解析

1.通常的解析:dom、dom4j 一般用于后台,把整个xml 加载到内存里,然后再进行解析,数据量大会导致内存溢出
2.sax 移动端:加载一行解析一行,移动端的内存比较小 ,解析比较麻烦
3.xpath::是依赖于dom4j进行操作,dom 解析

dom 解析的步骤

XML在浏览器会加载成一个dom树,获取这个对象:

获取dom对象的步骤

1.创建getDom方法,DocumentBuilderFactory 调用 newInstance()方法 返回本身对象
2.再调用 newDocumentBuilder() 方法获取到解析器
3.调用其parse()方法读取文件转换为dom对象

private Document document;
    //把文件转化为dom对象
    public void getDom(){
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            document = db.parse(new File("收藏信息.xml"));
            System.out.println(document);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
显示数据

1.创建show方法,根据document.getElementsByTagName(“标签”)对象获取标签元素,返回得到的是NodeList
2.标签进行遍历,.item()得到每一个Node标签
3.再强行转化成属性节点Element
4.根据键来获取值 getAttribute(“name”)返回String类型
==>> 获取这个节点下的子节点:
5.getChildNodes()返回NodeList
6.进行遍历获取其子节点
7.判断是否是元素节点:Element.ELEMENT_NODE
8.再进行遍历
9.强行转换
10.根据键来获取值 getAttribute(“name”) 返回String类型

public void show(){
        //根据对象获取标签元素
        NodeList nodebrandList = document.getElementsByTagName("Brand");
        //把标签元素进行遍历
        for (int i = 0;i < nodebrandList.getLength();i++){
            //获取到每一个节点对象
            Node nodeBrand = nodebrandList.item(i);
            //把节点对象转换为元素属性
            Element elementBrand = (Element)nodeBrand;
            //通过键来获取其值
            String brandName = elementBrand.getAttribute("name");
            System.out.println(brandName);

            //获取其子节点
            NodeList nodeListType = elementBrand.getChildNodes();
            //进行遍历
            for (int j = 0;j < nodeListType.getLength();j++){
                //获取到每一个子节点
                Node nodeType = nodeListType.item(j);
                //判断是否是元素节点
                if (nodeType.getNodeType() == Element.ELEMENT_NODE){
                    //转换为属性节点
                    Element elementType = (Element)nodeType;
                    //通过键来获取其值
                    String typeName = elementType.getAttribute("name");
                    System.out.println(typeName);
                }
            }
        }
增加一个节点

1.创建节点document.createElement(“Brand”) 返回Element
2.设置其属性 setAttribute(“name”, “opop”)
3.创建其子节点document.createElement(“Brand”) 返回Element
4.设置其属性 setAttribute(“name”, “r9”)
5.添加标签和属性的父子关系:appendChild(type)
6.获取根节点添加根标签和属性的父子关系

//增加一个节点
    public void add(){
        //创建属性节点
        Element brand = document.createElement("Brand");
        //设置其属性的值
        brand.setAttribute("name","oppo");
        //创建其子节点
        Element type = document.createElement("Type");
        //设置其子节点的值
        type.setAttribute("name","r19");
        //添加父子关系
        brand.appendChild(type);
        //type.getParentNode().appendChild(type);

        //获取根节点 添加父子关系
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(brand);

    }
把dom对象保存到xml

1.先创建一个解析器格式化工厂 :TransformerFactory 调用 newTransformer() ,返回自身对象
2.获取得到格式的类Transformer
3.创建DOMSource的对象,把document作为参数
4.new StreamResult(new OutputStreamWriter(new FileOutputStream(path),“utf-8”));
5.transform(ds, sr); 把dom 对象写入到文件里

//把创建的doc对象保存到xml文件里
    public void save(String path){
        try {
            //先创建一个格式化的解析工厂
            TransformerFactory tff = TransformerFactory.newInstance();
            //得到格式的类
            Transformer tf = tff.newTransformer();
            //把dom对象写到文件
            DOMSource ds = new DOMSource(document);
            StreamResult sr = new StreamResult(new OutputStreamWriter(new FileOutputStream(path)));
            tf.transform(ds,sr);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
修改

1获取节点:document.getElementsByTagName(“Brand”)返回的是NodeList
2.进行遍历,得到Node
3.获取每一个节点
4.强行转换为(Element)属性
5.设置其值:setAttribute

//修改
    public void update(){
        NodeList nodeBrandList = document.getElementsByTagName("Brand");
        for (int a = 0;a < nodeBrandList.getLength();a++){
            Node nodeBrand = nodeBrandList.item(a);
            Element elementBrand = (Element)nodeBrand;
            elementBrand.setAttribute("id",(a+1)+"");
        }
    }
删除节点:

1.通过 document.getElementsByTagName(“Brand”) 获取到所有的节点,返回NodeList
2.进行遍历
3.获取到每一个节点
4.强行转换为(Element)属性节点
5.通过键获取其值:getAttribute() 返回String
6.判断其值是否相等
7.相等就根据父节点删除子节点:getParentNode().removeChild()

 //删除节点
    public void delete(){
        //获取所有的Brand节点对象
        NodeList nodeBrandList = document.getElementsByTagName("Brand");
        //进行遍历
        for(int i = 0;i < nodeBrandList.getLength();i++){
            //得到每一个节点对象
            Node nodeBrand = nodeBrandList.item(i);
            //转化为属性节点
            Element elementbrand = (Element)nodeBrand;
            //通过键来获取其值
            String content = elementbrand.getAttribute("name");
            //判断其值是否相等
            if ("华为".equals(content)){
                //删除属性  根据父节点删除子节点
                elementbrand.getParentNode().removeChild(elementbrand);
            }
        }
    }
调用获取dom对象的方法
public static void main(String[] args) {
        Test test = new Test();
        test.getDoc();
        //test.add();
        //test.show();
        //test.update();
        test.delete();
        test.save("4.xml");
    }

dom4j 解析

对dom解析的一个封装,使得代码量变少,需要导入第三方的 jardom4j-1.6.1.jar

XML 文件转换成一个dom对象(dom4j jar 提供的)

1.实例化:SAXReader
2.read(new File(“传递是一个文件对象”))

private Document document;
    //把xml文件转化为一个dom对象
    public void getDom(){
        try {
            //作用:类似于解析器工厂
            SAXReader sr = new SAXReader();
            //调用其方法 读取文件
            document = sr.read(new File("收藏信息.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
XML 中的数据展示

1.获取其跟节点:getRootElement() 返回 Element
2.获取到根节点下所有的元素 elementIterator() 返回Iterator
3.进行遍历
4.根据键获取其值:attributeValue() 返回String,进行打印
==>>获取其子节点的显示:
5.获取属性节点下所有的元素 elementIterator() 返回Iterator
6.进行遍历
7.根据键获取其值:attributeValue() 返回String,进行打印

//展示xml文件中的手机品牌和型号
    public void show(){
        //获取根节点的方法
        Element elementRoot = document.getRootElement();
        //获取其下面的子节点
        //Iterator<Element> iterator = elementRoot.elementIterator();
        //遍历迭代器
        for (Iterator<Element> iterator = elementRoot.elementIterator();iterator.hasNext();){
            //获取到某一个节点
            Element elementbrand = iterator.next();
            //根据键获取其值
            System.out.println(elementbrand.attributeValue("name"));

            /*for (Iterator<Element> it = elementbrand.elementIterator();it.hasNext();){
                Element elementtype = it.next();
                System.out.println(elementtype.attributeValue("name"));
            }*/
            Iterator<Element> it = elementbrand.elementIterator();
            while (it.hasNext()){
                Element elementtype = it.next();
                System.out.println(elementtype.attributeValue("name"));
            }
        }
增加节点

1.获取跟节点:getRootElement() 返回 Element
2.添加一个子节点:addElement(“Brand”);
3. 设置其属性:addAttribute
4. 添加属性的子节点:addElement(“Type”);
5. 设置其属性:addAttribute

//增加一个节点
    public void add(){
        //获取根节点
        Element element = document.getRootElement();
        //添加一个子节点
        Element elementBrand = element.addElement("Brand");
        //设置其属性
        elementBrand.addAttribute("name","oppo");
        //创建Brand 的子节点
        Element elementType = elementBrand.addElement("Type");
        //设置其属性
        elementType.addAttribute("name","r19");
        //不需要再额外的添加父子关系了
    }
修改节点

1.获取根节点:getRootElement()
2.获取到根节点下所有的元素 elementIterator() 返回Iterator
3.进行遍历
4.进行修改键值对:addAttribute()
5.注意点:没有该属性就增加

//修改
    public void update(){
        //获取根节点
        Element element = document.getRootElement();
        //进行遍历
        int id = 0;
        for (Iterator<Element> iterator = element.elementIterator();iterator.hasNext();){
            id++;
            Element elementBrand = iterator.next();
            elementBrand.addAttribute("id",id+"");
        }
    }
删除节点

1.获取根节点:getRootElement()
2.获取到根节点下所有的元素 elementIterator() 返回Iterator
3.进行遍历
4.进行判断其值是否相等
5.根据父节点进行删除子节点

//删除 name为 华为 的节点
    public void delete(){
        //获取根节点
        Element element = document.getRootElement();
        for (Iterator<Element> iterator = element.elementIterator();iterator.hasNext();){
            Element elementbrand = iterator.next();
            if (elementbrand.attributeValue("name").equals("华为")){
                elementbrand.getParent().remove(elementbrand);
            }
        }
    }
dom对象写入到文件

1.创建输出流对象:FileWriter(path)
2.添加的格式:OutputFormat.createPrettyPrint()
3.设置其编码格式:setEncoding(“utf-8”);
4.实例化写入的对象:XMLWriter(fw,of);
5.调用其写的方法 写到对象中:write()

HTTP

http协议

1.http 是一个超文本传输协议
2.http 协议主要是用于传输文本,使文本传输更加高效
3.协议其实就是一种传输的规范

http 协议版本

1.0版本:传输的时候,只能请求一个web资源,连接完成就断开
1.1 版本:可以请求多个web资源(不是同时),最新版本

协议的概述

1.http 协议:称为一次性协议(不安全)
2.https:http+ssl证书(保护数据的安全性)
3.socket :就是长连接,只要连接成功,是不会断开的,socket中的心跳包来检测是否连接成功,即时通讯 xmpp+udp+tcp 结合使用
4.UDP:面向无连接,效率高、安全性低
5.TCP:面向连接,效率低、安全性高

http 的请求协议和响应协议

请求协议

1.也就是浏览器给服务器发送请求所遵循的规则

2.分为三个部分:
==>>1.请求行
==>>2.请求体
==>>3.请求头:都是键值对来进行表示 ,这个键都是预定义,也就是浏览器给其响应的含义

响应协议

1.也就是服务器给客户端响应所遵循的规则

2.分为三个部分:
==>>1.响应头 (关注)
==>>2.响应行
==>>3.响应体

3.响应的状态码:
==>>1.404 页面找不到
==>>2.302 重定向
==>>3.500 服务器发生了异常(代码出错了)
==>>4.200 请求成功
==>>5.304(表示缓存)

反射

1.框架的灵魂,所有的框架的技术都依赖于反射
2.框架:是一个半成品,使得开发更加简单
3.反射中的热修复:动态来修复bug,腾讯的bugly
4.反射:将类的各个部分组成一个新类 Class

java代码运行的三个阶段

1.源代码阶段
2.class阶段
3.运行阶段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值