XML简介 (EXtensible Markup Language)

news2025/2/4 21:46:14

XML简介 (EXtensible Markup Language)

可扩展标记语言

  • 特点
    • XML与操作系统、编程语言的开发平台无关
    • 实现不同系统之间的数据交换
  • 作用
    • 数据交互
    • 配置应用程序和网站
    • Ajax基石

XML标签

  • XML文档内容由一系列标签元素组成
<元素名 属性名="属性值">元素内容</元素名>
  • 属性值用双引号包裹
  • 一个元素可以有多个属性
  • 属性值中不能直接包含 < " &
  • 不建议使用的字符 ` >

XML编写注意事项

  • 注意事项
    • 所有XML元素都必须有结束标签
    • XML标签对大小写敏感
    • XML必须正确的嵌套
    • 同级标签以缩进对齐
    • 元素名称可以包含字母、数字或其他的字符
    • 元素名称不能以数字或者标点符号开始
    • 元素名称中不能包含空格
XML解析器
  • 解析器类型
    • 非验证解析器
      • 检查文档格式是否良好
    • 验证解析器
      • 使用DTD检查文档的有效性
XML命名空间
  • XML命名空间的作用
    • 解决在复杂 大型XML文件中 出现名称相同 但是含义不同的元素
<?xml version="1.0" encoding="UTF-8"?>
<cameras xmlns:canon="http://www.canon"
xmlns:nikon="http://www.nikon.com">
<canon:camera prodID="P663" name="Camera傻瓜相机"/>
<nikon:camera proID="K29B3" name="Camera超级35毫米相机"/>
</cameras>
解析XML技术
  • DOM
    • 基于XML文档树结构的解析
    • 适用于多次访问的XML文档
    • 特点:比较消耗资源
  • SAX
    • 基于事件的解析
    • 适用于大数据量的XML文档
    • 特点:占用资源少,内存消耗小
  • DOM4J
    • 非常优秀的Java XML API
    • 性能优异、功能强大
    • 开放源代码
DOM解析XML
  • DOM介绍
    • 文档对象模型(Document Object Model)
    • DOM把XML文档映射成一个倒挂的树
      在这里插入图片描述
常用接口介绍
  • DOM解析包:org.w3c.dom
常用接口常用方法说明
Document:表示整个XML文档NodeList getElementsByTagName(String Tag)按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName)创建指定标记名称的元素
Node:该文档树中的单个节点NodeList getChildNodes()获取该元素的所有子节点,返回节点集合
Element:XML文档中的一个元素String getTagName()获取元素名称

示例

<?xml version="1.0" encoding="UTF-8" ?>
<!--根标签只能有一对儿-->
<books>
    <!--在标签内可以写属性-->
    <!--转义符  > &gt;  < &lt; -->
    <!--1.属性值必须要用引号包裹
        2.一个元素可以有多条属性
        3.尽量不要使用 < > -->
    <book id="1" bookname="三体" price="12"/>

    <book>
        <id>1</id>
        <bookname>三体</bookname>
        <price>12</price>
    </book>
    <!--1. 所有的标签必须闭合-->
    <!--2. xml的标签对大小写敏感-->
    <!--3. 所有的xml标签 必须正确嵌套-->
    <!--4. 同级标签需要对齐缩进-->
    <!--5. 标签名称不能以数字或标点符号开始-->


</books>

练习

<?xml version="1.0" encoding="UTF-8" ?>
<clothes>
    <cloth range="height&lt;165">S</cloth>
    <cloth range="165&gt;height&lt;170">M</cloth>
    <cloth range="170&gt;height&lt;175">L</cloth>
    <cloth range="175&gt;height&lt;180">XL</cloth>
    <cloth range="180&gt;height">XXL</cloth>
</clothes>

import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class Test01 {
    public static void main(String[] args) {
        //通过解析器解析XML文件
        SAXReader saxReader=new SAXReader();
        try {
            saxReader.read("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

增删改查

查询

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.Iterator;

public class Test01 {
    public static void main(String[] args) {
        //通过解析器解析XML文件
        SAXReader saxReader=new SAXReader();
        try {
            //通过解析器获取文件对象  Document 文件文档
            Document document = saxReader.read("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml");
            //获取根节点
            Element root = document.getRootElement();
            //获取根节点的迭代器
            Iterator iterator = root.elementIterator();
            while (iterator.hasNext()){
                //获取子节点元素 获取到的是cloth标签
                Element element=(Element) iterator.next();
                //获取子元素节点的属性
                System.out.println(element.attributeValue("range"));
                //获取子元素节点的文本内容
                System.out.println(element.getText());
                
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}


public class Test03 {
    public static void main(String[] args) {
        Test02 test02=new Test02();
        //test02.add();//增加
        //test02.delete();//删除
        test02.update();//修改
    }
}

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;

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

public class Test02 {
    //对xml文件进行增删改查
    private  Document document;

    /**
     * 初始化
     */
    public  void init(){
        SAXReader saxReader=new SAXReader();
        try {
            document= saxReader.read("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 给xml文件内添加节点
     */
    public  void add(){
        init();
        //获取文档节点
        Element root=document.getRootElement();
        //在根节点下添加一个cloth节点
        Element cloth = root.addElement("cloth");
        cloth.addAttribute("id","123");
        cloth.addText("今天中午吃什么");
        save();
        System.out.println("添加成功!!");
    }
    /**
     * 保存文件
     */
    public  void save(){
        //创建输出格式并设置输出编码
        OutputFormat format=OutputFormat.createCompactFormat();
        format.setEncoding("utf-8");
        try {
            XMLWriter xmlwriter=new XMLWriter(new FileWriter("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml"));
            xmlwriter.write(document);
            xmlwriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除节点
     */
    public void delete(){
        init();
        //获取根节点
        Element root=document.getRootElement();
        //获取根节点迭代器
        Iterator iterator=root.elementIterator();
        //遍历子节点
        while (iterator.hasNext()){
            //获取子节点对象
            Element e=(Element) iterator.next();
            if (e.getText().equals("今天中午吃什么")){
                //从父节点中删除本节点
                e.getParent().remove(e);
                System.out.println("删除成功!!!");
            }
        }

        save();

    }

    /**
     * 修改
     */
    public void update(){
        init();
        Element root=document.getRootElement();
        Iterator iterator=root.elementIterator();
        while (iterator.hasNext()){
            Element e=(Element) iterator.next();
            // attributeValue 属性值
            if (e.attributeValue("id")!=null&&e.attributeValue("id").equals("123")){
                e.addAttribute("price","999");//给指定节点添加属性
                System.out.println("修改成功");
                break;
            }
        }
        save();

    }

}

JOSN简介

  • JSON(JavaScript Object Notation)
    • 轻量级的文本数据交换格式
    • 具有自我描述性
    • 比XML传输速度快
      JSON最初用来表示JavaScript中的对象
JSON相互转换
public class Test {
    public static void main(String[] args) {
        Student student=new Student();
        student.setName("张三");
        student.setAge(18);

        student.setHobby(new String[]{"篮球", "足球", "乒乓球"});

        
        System.out.println(student);
        //对象如何转换成 Json 字符串
        String str = JSONObject.toJSONString(student);
        System.out.println(str);
        
        System.out.println("Json字符串转对象-------------------------------");
        //Json字符串如何转对象  解析对象
        Student s1 = JSONObject.parseObject(str, Student.class);
        System.out.println(s1.toString());
    }
}

重写toString()方法

import java.util.Arrays;

public class Student {
    private String name;
    private Integer age;
    private String[] hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "{" +
                "\"name\":\"" + name + '\"' +
                "\", age\":" + age +
                ", \"hobby\":" + Arrays.toString(hobby) +
                '}';
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1328369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于时区处理策略

前端会通过 App-Id 请求头附带 客户端时区 信息 前端传入的如果是 字符串&#xff0c;会自动根据 请求的客户端时区 解析为对应的 日期 如果前端传入的是时间戳&#xff0c;则无需额外解析转换 如果是 商户后台、管理后台 都统一基于 商户所在国家的时区&#xff08;总台目前…

<九>JavaScript中函数,函数的定义方式,形参、实参和返回值

JavaScript中的函数&#xff0c;也是一个对象&#xff0c;函数对象有所有普通对象有的性质。还可以在这个对象中封装一些功能&#xff0c;保存一些代码&#xff0c;在需要的时候调用这些代码&#xff0c;用typeof查看时&#xff0c;会返回类型&#xff1a;function。 定义函数…

线程学习(2)

&#x1f495;"i need your breath"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;线程学习(2) 前情回顾&#xff1a; 在上一篇博客中介绍到了进程与线程的区别&#xff0c;以及初步了解如何在Java实现多线程编程&#xff0c;通过内置的Thread类来…

eNSP错误40,原因三:windows10自带虚拟化软件Hyper-V

问题描述 Hyper-V软件与VirtualBox不兼容&#xff0c;一旦开启Hyper-V的话eNSP的路由器就会无法开启&#xff0c;显示ERROR 40 原理 大家注意看hypervisor的两种类型&#xff1a; 左边的是开启hypervisor的Type-1&#xff0c;hypervisor在启用的时候&#xff0c;宿主机也相…

SQL指南:掌握日期函数来查询和管理数据

文章目录 1. 引言2. 建立数据库表2.1 建表语句2.2 数据插入 查询案例3.1 查询当前日期的订单3.2 查询过去一周内的订单3.3 查询明天的日期3.4 查询今年的订单3.5 查询特定月份的订单 总结 1. 引言 在数据库管理中&#xff0c;处理日期和时间是一项基本但重要的任务。本指南将通…

Android笔记(十九):JetPack DataStore 之 Preferences DataStore

Jetpack DataStore 是一种数据存储解决方案&#xff0c;主要适用于小型数据的处理。它可以通过协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。DataStore有两种实现方式&#xff08;1&#xff09;Preferences DataStor…

如何搭建Web自动化测试框架?

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

Enge问题解决教程

目录 解决问题的一般步骤&#xff1a; 针对"Enge问题"的具体建议&#xff1a; 以下是一些普遍适用的解决问题的方法&#xff1a; 以下是一些更深入的Enge浏览器问题和解决办法&#xff1a; 浏览器性能问题&#xff1a; 浏览器插件与网站冲突&#xff1a; 浏览…

R语言中使用ggplot2绘制散点图箱线图,附加显著性检验

散点图可以直观反映数据的分布&#xff0c;箱线图可以展示均值等关键统计量&#xff0c;二者结合能够清晰呈现数据蕴含的信息。 本篇笔记主要内容&#xff1a;介绍R语言中绘制箱线图和散点图的方法&#xff0c;以及二者结合展示教程&#xff0c;添加差异比较显著性分析&#xf…

Android13 Wifi启动流程分析

Android13 Wifi启动流程分析 文章目录 Android13 Wifi启动流程分析一、正常开关wifi 启动流程1、WifiManager2、WifiServiceImpl3、ActiveModeWarden4、ConcreteClientModeManager5、WifiNative6、WifiVendorHal7、HalDeviceManager8、wifi.cpp 二、重启设备时自动开启wifi流程…

云原生之深入解析基于FunctionGraph在Serverless领域的FinOps的探索和实践

一、背景 Serverless 精确到毫秒级的按用付费模式使得用户不再需要为资源的空闲时间付费。然而&#xff0c;对于给定的某个应用函数&#xff0c;由于影响其计费成本的因素并不唯一&#xff0c;使得用户对函数运行期间的总计费进行精确的事先估计变成了一项困难的工作。以传统云…

亚马逊推出 Graviton4:具有 536.7 GBps 内存带宽的 96 核 ARM CPU

如今&#xff0c;许多云服务提供商都设计自己的芯片&#xff0c;但亚马逊网络服务 (AWS) 开始领先于竞争对手&#xff0c;目前其子公司 Annapurna Labs 开发的处理器可以与 AMD 和英特尔的处理器竞争。本周&#xff0c;AWS 推出了 Graviton4 SoC&#xff0c;这是一款基于 ARM 的…

斩获冠亚军!开源检索引擎Puck闪耀NeurIPS‘2023

近日&#xff0c;备受全球瞩目的国际向量检索大赛 Big-ANN in NeurIPS’23 的排行榜正式公布。百度搜索内容技术团队&#xff0c;以其自研 ANN 检索算法 PUCK 的出色性能表现&#xff0c;成功斩获Streaming Search赛道冠军与Filtered Search赛道亚军。 NeurIPS&#xff08;Con…

Spring项目启动,运行停留在标题处

详情&#xff1a; 原因&#xff1a; yml文件存在问题&#xff0c;比如&#xff1a;在切换生产环境和开发环境的配置文件时&#xff0c;yml名称写错&#xff0c;如下&#xff0c;图&#xff0c;此处多写了一个p。 解决办法&#xff1a; 修改为正确的配置文件&#xff0c;即可。

27、ResNet50处理STEW数据集,用于情感三分类+全备的代码

1、数据介绍 IEEE-Datasets-STEW:SIMULTANEOUS TASK EEG WORKLOAD DATASET &#xff1a; 该数据集由48名受试者的原始EEG数据组成&#xff0c;他们参加了利用SIMKAP多任务测试进行的多任务工作负荷实验。受试者在休息时的大脑活动也在测试前被记录下来&#xff0c;也包括在其…

Java 中的内部类的定义

目录 一、成员内部类 二、静态内部类 三、局部内部类 四、匿名内部类 一、成员内部类 public class InnerClass {String name;private Integer age;static String hobby;/*** 成员内部类* 1、成员内部类中只能定义非静态属性和方法* 2、成员内部类中可以访问外部类的成员&a…

【深度学习实践】换脸应用dofaker本地部署

本文介绍了dofaker换脸应用的本地部署教程&#xff0c;dofaker支持windows、linux、cpu/gpu推理&#xff0c;不依赖于任何深度学习框架&#xff0c;是一个非常好用的换脸工具。 本教程的部署系统为windows 11&#xff0c;使用CPU推理。 注意&#xff1a; 1、请确保您的所有路…

晋江IP影视化频频折戟,网文陷入工业化困境

在影视行业进入IP时代的2023年&#xff0c;晋江文学城&#xff08;以下简称晋江&#xff09;IP影视化却迎来了大溃败。 2023年&#xff0c;晋江IP在影视行业依旧十分抢手&#xff0c;多部热门网文被影视化&#xff0c;其中不乏头部视频网站的S大制作&#xff0c;但播出效果却有…

.NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式

之前写过使用自定义返回类的方式来统一接口数据返回格式&#xff0c;.Net Core webapi RestFul 统一接口数据返回格式-CSDN博客 但是这存在一个问题&#xff0c;不是所有接口会按照定义的数据格式返回&#xff0c;除非每个接口都返回我们自定义的类&#xff0c;这种实现起来不…

Mybatis-plus动态条件查询QueryWrapper的函数用法

目录 前言1. QueryWrapper2. 函数3. Demo 前言 原本都是在Mapper文件中修改&#xff0c;直到看到项目中使用了QueryWrapper这个函数&#xff0c;大致了解了用法以及功能&#xff0c;发现还可以&#xff01; 对此此贴为科普帖以及笔记帖 1. QueryWrapper MyBatis-Plus 是 My…