xml重点笔记(尚学堂 3h)

news2024/11/13 15:26:16

XML:可扩展标记语言

主要内容(了解即可)

1.XML介绍

2.DTD

3.XSD

4.DOM解析

6.SAX解析

学习目标

image-20240916095028616

一. XML介绍

1.简介

XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写

2.XML和HTML

XML是用来传输和存储数据的。

XML多用在框架的配置文件中

XML大多平台都支持,所以可以实现跨平台数据传输

HTML是用来显示数据的

3.XML的引入

XML的引入:

保存5个学生对象的信息(持久化保存)

A、保存数组/集合====>内存中当项目重启后我们保存到内存中数据就会丢失

B、使用IO流保存到文件中优点:实现数据的持久化保存缺点:保存数据比较麻烦,并且保存的对象值我们看不懂

C、使用XML进行数据的保存
[1]进行数据的存储(数据存储的功能就在这个阶段使用,以后不用xmL进行数据存储)
[2]在我们后期学习(javaEE/框架)中充当配置文件
D、数据库(最终数据存储位置)

4.语法

<元素名 属性名=“属性值”>文本内容</元素名>。

前后元素名相同,元素名自定义。

每个元素可以有0到多个属性,属性名自定义。

文本内容表示文字。

支持嵌套结构。

结束时元素名前有/。

5.语法要求

XML的语法和HTML语法是差不多的,但是比HTML要求更加严格。

1.元素正确嵌套

2.XML文件的第一行必须是xml声明

3.只能有一个根节点

4.严格区分大小写

5.结束标签必须包含/

6.属性值的设置必须被包围起来

7.XML认为换行标记也属于文本节点

8.<!---->注释。有的非官方资料认为这是注释节点。

<?xml version="1.0" encoding="utf-8"?> <!--文档头,声明版本和编码 -->
<students> <!--在xml中只可以定义一个根节点,并且是一个双标签-->
    <student id="1"> <!--属性节点-->
        <name>张三</name>
        <age>12</age> <!--元素节点-->
        <score>88</score><!-- 文本内容/文本值节点-->
	</student>
    <student id="2">
        <name>李四</name>
        <age>13</age>
        <score>99</score>
    </student>
</students>

6.特殊符号

6.1 实体符号
字符实体特殊字符含义
&It<小于
&gt>大于
&amp&和号
&apos单引号
&quot"双引号
6.2 转义标签
<font style='color:blue'> <![CDATA[要打印内容]] </font>

二,小节实现案例-编写XML文件

1.需求

项目根路径下创建product.xml并存储下面信息。

根节点叫做products,里面包含3个product元素。每个元素里面又包含下面的元素及文本内容

image-20240916103934692

2.实现

<?xml version="1.0" encoding="utf-8" ?> <!--xml的文档声明-->
<products>
	<product>
		<id>P001</id>
		<name>蜘蛛王皮鞋</name>
		<price>268</price>
		<color>黑色</color>
		<size>42</size>
		<num>500</num>
</product>
		<!-- ... -->
</products>

三.DTD(约束)

1.简介

DTD(Document Type Definition) 文档类型定义

即约束XML文件中可以包含哪些元素、哪些属性、及元素个数和元素之间的关系和元素的顺序。

在包含DTD的XML文件中,如果XML内容不满足DTD要求,会提示错误。

2.分类

DTD的三种分类:

1.内部DTD

2.外部DTD

3.公共DTD

2.1内部DTD

直接在XML中编写DTD内容。不推荐。

  1. <!ELEMENT元素名(包含内容)>内容可以是其他标签,也可以是#PCDATA文本内容。
  2. <!ATTLIST元素名属性名CDATA内容控制>定义属性
  3. 内容控制可取值:
    1. #REQUIRED必须有这个属性
    2. #IMPLIED可以有也可以没有

​ 3. #FIXED“内容”必须取固定值

  1. (name,age,score)表示顺序必须是先name,后age,然后score

  2. student+表示student至少出现一次。括号内容的元素名都可以跟下面符号
    1.?表示子元素出现0次到1次(最多出现一次)

    2.+表示子元素至少出现一次(至少出现一次)

    3.*表示子元素可以出现0到多次(任意)

<?xml version="1.0" encoding="UTF-8"> <!--声明xm1文档头
<!-- 内部DTD约束 -->
<!--
    !DOCTYPE: 固定语法文档类型
    students: 自定义根标签名字
    []: 存放子标签
    ELEMENT: 元素(标签)
    #PCDATA:元素是字符串类型#PCDATA(不能再有子元素,也不能为空)
		DTD中标签的顺序就是日后使用的顺序,不允许改变
-->
<!DOCTYPE students [
    <!-- 标签 -->
    <!--
    (student): 只能有一对student标签
    (student?): 0~1次
    (student+): 至少1次
    (student*): 0~多次
	-->
    <!ELEMENT students (student*)>
    <!ELEMENT student (name, age, sex)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT SeX (#PCDATA)>
    <!--属性-->
	<!-- 
        ATTLIST: 属性
        student: 哪个标签指定属性
        id: 指定的属性名
        CDATA: 属性控制
            #REQUIRED: 必须有
            #FIXED“值": 固定值
            #IMPLIED: 可有可无
    -->
        <!ATTLIST student id CDATA #REQUIRED>
        <!ATTLIST name class CDATA #FIXED"qwe">
        <!ATTLIST age test CDATA #IMPLIED>
]>
<students>
	<student id="aa">
		<name class="qwe">张三</name>
		<age test="aaa">18</age>
		<sex></sex>
	</student>
</students>
2.2外部DTD(项目配置文件来源于此!!!)

外部DTD是我们自己编写的DTD文件。通过引I入方式引I入DTD。

在外部创建一个xxx.dtd文件,文件内容和内部dtd[]中的内容相同。

1.新建dtd文件
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT SeX(#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>
<!ATTLIST name class CDATA #FIXED "qwe">
<!ATTLIST age test CDATA #IMPLIED>
2.xml引入外部dtd文件
<?xml version="1.0" encoding="uTF-8" ?>
<!DOCTYPE students SYSTEM "aa.dtd">
<students>
	<student id="aa"
		<name class="qwe">张三</name>
		<age test="aaa">18</age>
		<sex></sex>
	</student>
</students>
2.3公共DTD

公共DTD是一些开源组织编写的DTD,并且已经发布到互联网中。
公共DTD语法:
< !DOCTYPE 根元素 PUBLIC “DTD标识名” “公用DTD的URI”>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">

3, 总结

DTD是较简单的语法检查机制。整体语法较简单,功能较单一。
当需要对XML文件结构更新时,需要修改整个DTD文件,不够灵活。

四, XSD

1.简介

XSD(XML Schema Definition)XML模式定义。

属于DTD的升级版。完美的解决了DTD使用时不易扩展问题,并且提供了更强大功能。

2.定义XSD

新建xxx.xsd。

所有需要的元素,属性都需要被定义。

<!--
	声明xsd约束
		aa: 自定义名称(随意)
	schema: 约束(固定)
-->
<aa:schema xmlns:aa="http://www.w3.org/2001/XMLSchema">
	<!--
		aa:element: 标签
		name: 标签名
    -->
	<aa:element name="students">
		<!--必须设置为复杂类型-->
		<aa:complexType>
			<!--在此标签中规范了标签的顺序
			<aa:sequence>
            <!--引用其他标签 -->
            <!--maxoccurs: 指定可以有多少个标签-->
            <aa:element ref="student"maxoccurs="2"/>
			</aa:sequence>
		</aa:complexType>
	</aa:element>
<aa:element name="student">
	<!--复杂类型可以指定 包含的标签 属性-->
	<aa:complexType>
		<aa:sequence>
			<!--type: 值的类型-->
			<aa:element name="name" type="aa:string"/>
			<aa:element name="age" type="aa:int"/>
			<aa:element name="sex" type="aa:boolean"/>
	</aa:sequence>
    <!--
        	use:属性的设置
				required: 必须存在
				prohibited: 禁用
				optional: 可选的
			fixed="值": 固定值
     -->
		<aa:attribute name="id" use="optional" fixed="aa"/>
	</aa:complexType>
</aa:element>

3.引用xsd

<?xml version="1.0" encoding="uTF-8" ?>
<students xm1ns:xsi="http://www.w3.org/2001/xMLSchema-instance"
		  xsi:noNamespaceSchemaLocation="s.xsd">
	<student id="aa">
		<name></name>
		<age>11</age>
		<sex>false</sex>
	</student>
</students>

五.XML 解析

1.简介

在Java中提供了两种XML解析方式: DOM、SAX。

2.DOM解析

​ Document Object Model文档对象模型。把XML文件一次性加载到内存中,并转换为树状模型。然后一个节点一个节点的解析,这种解析方式效率较高,但是比较消耗内存,适用于小型XML文档。

image-20240916140617102

3.SAX(Spring)

SAX(SimpleAPIforXML)解析:是基于事件的解析,它是为了解决DOM解析的资源耗费而出现的。SAX在解析一份XML文档时,会依次出发文档开始、元素开始、元素结束、文档结束等事件,应用程序通过监听解析过程中所触发的事件即可获取XML文档的内容。该方式不需要事先调入整个文档,优势是占用资源少,内存消耗小,一般在解析数据量较大的文档是采用该方式。

六.DOM解析

1.简介

DOM解析所有API都是org.w3c包中。

使用DOM操作XML按照标准树状结构一层一层解析。

解析器是基于工厂设计模式的。当获取到文档对象后每个元素都是一个节点,然后操作节点对象。

在DOM解析时,每个换行符都是一个文本节点,所以一定要过滤掉换行。

image-20240916140952399

2.代码示例

以上面的students作为xml进行解析。

已知XML文件就三层结构,所以直接使用循环进行解析。如果XML文档结构比较深,此处需要使用递归。

public class TestDoM {
	public static void main(String[] args) throws Exception {
		parse();
	}
                            
    //使用DoM解析XML
    public static void parse() throws ParserConfigurationException, IoException, SAXException {
        
        //1.获取document构建 工厂对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        //2.根据文档构建工厂获取文档构建对象
        /* 将xm1变为document
         * 手动的创建document
         **/  
        DocumentBuilder db = dbf.newDocumentBuilder();
        //3.使用文档构建对象,将xm1解析为document对象

        Document document = db.parse(new File("stu.xm1"));
        //4.根据标签名获取跟标签

        NodeList rootList = document.getElementsByTagName("students");
        //5.xm1中仅会存在一个跟标签,获取这个根标签

        Node root = rootList.item(0);
        System.out.print1n ("根节点名称: " + root.getNodeName();
        //6.获取标签所有的直接子节点

        NodeList chi1dNodes = root.getChi1dNodes();
        for (int i = 0; i < childNodes.getLength(); i++{
            //7.获取每一个子节点
            /*
            *	    getNodeType(): 结点类型,常量
            *	  	1: 标签结点
            *	 	2: 属性结点
            *		3: 文本结点
            **/
            Node item = childNodes.item(i);
            if (item.getNodeType() == Node.ELEMENT_NODE) {
                System.out.println("子节点名称: " + item.getNodeName());
                //8.获取该结点的所有子节点
                NodeList childNodes1 = item.getChildNodes();发送
                forint j = 0; j < childNodes1.getLength(); j++) {
                    Node item1 = childNodes1.item(j);
                    if (item1.getNodeType() == Node.ELEMENT_NODE) {
                        System.out.println("子节点名称: " + item1.getNodeName() + ":" + item1.getTextContent()));
                    }
                }
             }
         }      
      }    
   }

七.使用DOM生成XML

1.简介

DOM生成XML时主要是创建节点。然后把节点添加到上层节点。

2.代码示例

public class TestDoM {
    public static void main(String[] args)throws Exception {
        transform();
    }
	//先构建文档,再将文档变为xml
	public static void transform throws ParserConfigurationException, TransformerException, FileNotFoundException{
        //1.获取文档构建器工厂对象
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        //2.构建器工厂对象 获取 构建器对象
        DocumentBuilder db=dbf.newDocumentBuilder();
        //3.创建文档对象
        Document document=db.newDocument();
        //4.创建teachers标签
        Element teachers=document.createElement("teachers");
        //5.创建teacher标签
        Element teacher =document.createElement("teacher");
        teacher.setAttribute("id","tea");//设置属性
        //6.创建name标签
        Element name =document.createElement("name");
        name.setAttribute("class", "na"); // 设置属性
        name.setTextContent("zs");
        //7.创建age标签
        Element age = document.createElement("age");
        age.setTextContent("18");
        //8.创建sex标签
        Element sex = document.createElement("sex");
        sex.setTextContent("男");
        //9.设置标签之间的关系
        //添加teacher的子标签*
        teacher.appendchild(name);
        teacher.appendchild(age);
        teacher.appendchild(sex);
    }
}    

八.SAX解析

1.简介

SAX解析是基于事件模型完成的。所有的API都在org.Xml中。
SAX解析时也会识别换行为文本节点,这个坑一定躲避。

2.代码示例

public class TestSAX {
	public static void main(String[] args) throws Exception {
		parse();
    }
    
    public static void parse() throws Exception {
        //1.SAX解析器工厂对象
        SAXParserFactory spf = SAXParserFactory.newInstance();
        //2.基于工厂对象获取解析器对象
        SAXParser sp = spf.newSAxParser();
        //3.使用解析器解析xml
        sp.parse(new File("java_day13/teacher.xm1"),new MyHandler());
    }
    
    public class MyHandler extends DefaultHandler {
        String name = null;

        @override
        public void startDocument() throws SAXException {
            System.out.print1n("文档开始解析");
        }

        @override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            System.out.println("开始解析,标签名: " + qName);
            name = qName;
        }
        
        @Override
        
    }     
}

九, SAX生成

1.简介

SAX生成XML和手写XML比较相似。

也是在调用5个操作方法。

2.代码生成

public class TestSAX {
    public static void main(String[] args) throws Exception {
    	parse();
    }
	public void transfom() throws TransformerConfigurationException, FileNotFoundExceptionSAxException {
        //1.创建转换器工厂
        SAXTransformerFactory stff =(SAXTransformerFactory) SAXTransformerFactory.newInstance();
        //2.根据工厂获取转换器
        /*
         *传输
         *创建xml
         **/ 
        TransformerHandler th = stff.newTransformerHandler();
        Transformer transformer = th.getTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT,"yes");
        transformer.setOutputProperty(OutputKeys.ENcoDING,"utf-8");
        transformer.setoutputProperty("{http://xml.apache.org/xslt}indent-amount","2");
        th.setResult(new StreamResult(new FileoutputStream("stu.xml")));
        th.startElement(null,null,“students",null);
        AttributesImpl attributes = new AttributesImpl();
        attributes.addAttribute(nullnull,“id",null,“aa");
        th.startElement(nullnull"student",attributes);
        th.startElement(null, null, "name", null);
        char[] chars = "zs".tocharArray();
        th.characters(chars,0,chars.length);
        th.endElement(null, null, "name");
        th.startElement(null, null,"age", null1);
        char[] chars1 = "19".toCharArray();
        th.characters(chars1,0,chars1.1ength);
        th.endElement(null, null, "age");
        th.startElement(null, null, “sex", null);
        char[] chars2 ="男".tocharArray();
        th.characters(chars2,0,chars2.length);
        th.endelement(null, null,"sex");
        th.endElement(null,null,“student");
        th.endelement(null,null,“students");
        th.endDocument();
    }
}

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

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

相关文章

基于Python DoIPClient库的DoIP上位机开发手顺

代码 address, announcement DoIPClient.await_vehicle_announcement()logical_address announcement.logical_addressip, port addressprint(ip, port, logical_address) 效果 代码 address, announcement DoIPClient.get_entity(ecu_ip_addresssIp, protocol_version3…

【VitualBox】VitualBox的网络模式+网络配置

VirtualBox 1. 简介 VirtualBox 是一款开源虚拟机软件&#xff0c;使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。 2. 六种网络接入模式 VirtualBox提供了多种网络接入模式&#xff0c;他们各有优缺点&#xf…

Setting Design Properties

设置设计属性 接下来&#xff0c;在设计上设置配置模式。这是导致物理 约束&#xff0c;在这种情况下是设计的属性&#xff0c;而不是单元的属性。首先&#xff0c;列出所有 当前设计的特性。 1.在Tcl控制台中列出设计的属性&#xff1a; list_property [current_design] 此命…

本地安装MySQL并配置环境变量

MySQL是一个关系型数据库管理系统&#xff0c;是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系数据库管理系统) 应用软件之一。 本地安装MySQL 提供了 MySQ…

mysql笔记8(多表查询)

文章目录 1. union联合查询可能会用到去重操作 2. inner join 内连接3. left join 左连接4. right join 右连接5. cross join 交叉连接6. natural join 自然连接natural left join 自然左连接natural right join 自然右连接自然连接的两张表没有同名字段怎么办&#xff1f; 7. …

LLMs之SWIFT:SWIFT的简介、安装和使用方法、案例应用之详细攻略

LLMs之SWIFT&#xff1a;SWIFT的简介、安装和使用方法、案例应用之详细攻略 目录 SWIFT的简介 新闻 &#x1f6e0;️ 安装 &#x1f680; 快速开始 Web-UI 训练 训练脚本 支持的训练过程 单卡训练 模型并行训练 数据并行训练 Deepspeed训练 多机多卡 阿里云-DLC多…

棋盘格角点检测-libcbdetect

libcbdetect libcbdetect 是一个用于自动子像素级别的棋盘格&#xff08;checkerboard&#xff09;、棋盘&#xff08;chessboard&#xff09;以及 Deltille 图案检测的库。它主要由 C 编写&#xff0c;旨在提供高精度、高鲁棒性的角点检测和图案组合功能&#xff0c;是一种基…

数据中心可视化管理平台:提升运维效率

通过图扑可视化平台实时监控设备状态、能耗和网络流量&#xff0c;帮助运维团队快速识别和处理异常&#xff0c;提高运营效率&#xff0c;确保系统稳定与可靠性。

在 Dify 中高效利用 SiliconCloud API

引言 SiliconCloud 以其丰富的模型库和卓越的处理速度&#xff0c;在 Dify 平台上实现高效工作流和智能代理变得轻而易举。本文将指导您如何在 Dify 中集成 SiliconCloud 的强大功能。 集成 SiliconCloud 模型 步骤一&#xff1a;设置 SiliconCloud 账户 首先&#xff0c;您…

SHT30温湿度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理 三、程序设计 main.c文件 sht30.h文件 sht30.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 SHT30是一种常见的温湿度传感器&#xff0c;是一款完全校准的线性化的温湿度数字传感器&#xff0…

8.1 溪降技术:横渡绳

目录 8.1 横渡绳将其置于上下文中&#xff1a;观看视频课程电子书&#xff1a;横渡绳一级横渡绳&#xff1a;识别使用横渡绳固定到横渡绳V7提示&#xff1a;保持张力中间点通过横渡绳上的中间点固定到锚点总结 8.1 横渡绳 绳上移动 横渡绳是一条水平安全绳&#xff0c;探险者可…

vue3 自定义el-tree树形结构样式

这里样式设置主要用到了 windcss 实现效果 模拟数据 这里也可以用模拟的数据,下面用的是后端请求的真实数据 [{"id": 5,"rule_id": 0,"status": 1,"create_time": "2019-08-11 13:36:09","update_time": "…

集团门户网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装集团门户网站软件来发挥其高效地信息处理的作用&#xff0c…

深度学习之线性代数预备知识点

概念定义公式/案例标量(Scalar)一个单独的数值&#xff0c;表示单一的量。例如&#xff1a;5, 3.14, -2向量 (Vector)一维数组&#xff0c;表示具有方向和大小的量。 &#xff0c;表示三维空间中的向量 模(Magnitude)向量的长度&#xff0c;也称为范数&#xff08;通常为L2范数…

【论文阅读】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning

Abstract 在这篇论文中&#xff0c;我们研究了使基于视觉的机器人操纵系统能够泛化到新任务的问题&#xff0c;这是机器人学习中的一个长期挑战。我们从模仿学习的角度来应对这一挑战&#xff0c;旨在研究如何扩展和扩大收集的数据来促进这种泛化。为此&#xff0c;我们开发了…

掌握回流与重绘面试回答:优化网页加载与响应速度

认识回流reflow和重绘repaint 理解回流reflow:(也可以称之为重排) 第一次确定节点的大小和位置&#xff0c;称之为布局(layout)。 之后对节点的大小、位置修改重新计算称之为回流 什么情况下引起回流呢&#xff1f; 比如DOM结构发生改变&#xff08;添加新的节点或者移除节…

Cortex-A7的GIC(通用中断控制器):边沿触发和电平触发中断的区别

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 边沿触发和电平触发中断的区别 1.1 边沿触发和电平触发中断官方解释 边沿触发&#xff08;Edge-triggered&#xff09; This is an interrupt that is asserted on detectio…

架构设计——概念和基础

&#x1f3e0;1 架构基础 想要搞清楚架构到底指什么&#xff0c;架构与框架的区别&#xff0c;就需要了解梳理系统、子系统、模块、组件、框架和架构 1.1系统与子系统 1.1.1系统 wiki:系统泛指由一群有关联的个体组成&#xff0c;根据某种规则运作&#xff0c;能完成个别元…

无限制使用OpenAI最新o1-mini、o1-preview模型:经济高效的AI推理模型

OpenAI 最新推出的 o1 模型是该公司推理模型家族的首位成员&#xff0c;它通过创新的“思维链”训练模式&#xff0c;显著提升了逻辑推理和问题解决的能力。o1 模型在编程竞赛问题、数学奥林匹克资格赛以及物理、生物和化学问题的基准测试中表现出色&#xff0c;甚至在某些领域…

数据爬虫中遇到验证码的解决方法

在数据爬虫中遇到验证码是一个常见且复杂的问题&#xff0c;验证码的存在主要是为了阻止自动化工具&#xff08;如爬虫&#xff09;对网站进行过度访问或数据抓取&#xff0c;以保护网站的安全性和数据的准确性。 一、验证码的基本概念与类型 验证码&#xff08;CAPTCHA&…