XML:可扩展标记语言

XML:可扩展标记语言

主要内容

  • XML介绍
  • DTD
  • XSD
  • DOM解析
  • SAX解析

学习目标

知识点要求
XML介绍掌握
DTD掌握
XSD掌握
DOM解析掌握
SAX解析掌握

一、XML介绍

1. 简介

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

2. XML和HTML

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

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

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

HTML 是用来显示数据的。

3. 语法

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

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

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

文本内容表示文字。

支持嵌套结构。

结束时元素名前有 /。

4. 语法要求

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

​ 1. 元素正确嵌套

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

​ 3. 只能有一个根节点

​ 4. 严格区分大小写

​ 5. 结束标签必须包含/

​ 6. 属性值必须被""包围起来

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

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

5. 特殊字符

5.1 实体符号
image-20220328183821908
5.2 转义标签

<![CDATA[

要显示的字符

]]>

二、小节实战案例 - 编写XML文件

1. 需求

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

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

id名称(name)单价(price)颜色(color)尺寸(size)库存(num)
P001蜘蛛王皮鞋268黑色42500
P002ThinkPad x2405678黑色1250
P003WD移动硬盘568蓝色51000

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" ?> <!-- 声明xml文档头 -->
<!-- 内部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文件。通过引入方式引入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>
  1. 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">

代码示例:

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>
</aa:schema>

3. 引用xsd

<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns: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文档。

3. SAX

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

六、DOM解析

1. 简介

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

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

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

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

2. 代码示例

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

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

public class TestDOM {public static void main(String[] args) throws Exception {parse();}//使用DOM解析XMLpublic static void parse() throws ParserConfigurationException, IOException, SAXException {//1.获取document构建 工厂对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//2.根据文档构建工厂获取文档构建对象/** 将xml变为document* 手动的创建document* */DocumentBuilder db = dbf.newDocumentBuilder();//3.使用文档构建对象, 将xml解析为document对象Document document = db.parse(new File("stu.xml"));//4.根据标签名获取根标签NodeList rootList = document.getElementsByTagName("students");//5.xml中仅会存在一个根标签, 获取这个根标签Node root = rootList.item(0);System.out.println("根节点名称: " + root.getNodeName());//6.获取标签所有的直接子节点NodeList childNodes = root.getChildNodes();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();for (int 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();}//先构建文档, 再将文档变为xmlpublic 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);/* 添加teachers的子标签 */teachers.appendChild(teacher);/* 添加文档的子标签 */document.appendChild(teachers);/* 设置为独立的xml */document.setXmlStandalone(true);//10.将document对象变为xml//10.1 创建转换器工厂对象TransformerFactory tff = TransformerFactory.newInstance();//10.1 根据转换器工厂对象 获取 转换器Transformer tf = tff.newTransformer();tf.setOutputProperty(OutputKeys.INDENT, "yes");tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");//10.3 将document转化为xml  通过流输出到指定的位置/** 参数1: 指定document源* 参数2: 输出的位置* */tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("teacher.xml")));}
}

八、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.使用解析器解析xmlsp.parse(new File("java_day13/teacher.xml"), new MyHandler());}public class MyHandler extends DefaultHandler {String name = null;@Overridepublic void startDocument() throws SAXException {System.out.println("文档开始解析");}@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {System.out.println("开始解析, 标签名: " + qName);name = qName;}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {String s = new String(ch, start, length);System.out.println(s);}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.println("解析结束, 标签名: " + qName);}@Overridepublic void endDocument() throws SAXException {System.out.println("文档解析结束");}}}

九、SAX 生成

1. 简介

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

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

2. 代码示例

public class TestSAX {public static void main(String[] args) throws Exception {parse();}public void transfom() throws TransformerConfigurationException, FileNotFoundException, SAXException {//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(null, null, "id", null, "aa");th.startElement(null, null, "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", null);char[] chars1 = "19".toCharArray();th.characters(chars1, 0, chars1.length);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();}
}

作业:

使用SAX | DOM 解析xml, 将解析xml的代码封装到一个方法中, 调用该方法返回一个对象(将xml解析的内容创建对象. 设置属性值, 返回对象)

<phone id="iph"><name>ls</name><price>1999</price><color>黑色</color>
</phone>解析后:phone对象 属性值 name ls  price 1999 color 黑色

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

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

相关文章

react将选中本文自动滑动到容器可视区域内

// 自动滚动到可视区域内useEffect(() > {const target ref;const wrapper wrapperRef?.current;if (target && wrapperRef) {const rect target.getBoundingClientRect();const wrapperRect wrapper.getBoundingClientRect();const isVisible rect.bottom &l…

RPM与YUM

RPM RPM是Red Hat Package Manager的缩写&#xff0c;它是一种用于安装、卸载、升级和管理RPM包的工具。RPM使用一种数据库记录的方式来将软件安装到Linux系统&#xff0c;可以自动解决依赖性问题&#xff0c;并且提供了查询和校验等功能。 以下是使用rpm的基本操作&#xff…

python Flask 写一个简易的 web 端程序(附demo)

python Flask 写一个简易的 web 端程序 &#xff08;附demo&#xff09; 介绍简单介绍装饰器 app.route("/") 进阶增加接口设置端口 静态网页核心代码完整代码 介绍 Flask 是一个用于构建 Web 应用程序的轻量级 Python Web 框架。它设计简单、易于学习和使用&#x…

[N-139]基于springboot,vue宠物领养系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vue3element-plus 服务端技术&#xff1a;springbootmybatis-plusr…

Vue-easy-tree封装及使用

1.使用及安装 下载依赖 npm install wchbrad/vue-easy-tree引入俩种方案 1.在main.js中引入 import VueEasyTree from "wchbrad/vue-easy-tree"; import "wchbrad/vue-easy-tree/src/assets/index.scss" Vue.use(VueEasyTree)2.当前页面引入 import VueEa…

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…

2024年第三届能源与环境工程国际会议(CFEEE 2024) | Ei&Scopus双检索

会议简介 Brief Introduction 2024年第三届能源与环境工程国际会议(CFEEE 2024) 会议时间&#xff1a;2024年12月12日-14日 召开地点&#xff1a;澳大利亚凯恩斯 大会官网&#xff1a;CFEEE 2024-2024 International Conference on Frontiers of Energy and Environment Engine…

day42_jdbc

今日内容 0 复习昨日 1 JDBC概述 2 JDBC开发步骤 3 完成增删改操作 4 ResultSet 5 登录案例 0 复习昨日 1 写出JQuery,通过获得id获得dom,并给input输入框赋值的语句 $(“#id”).val(“值”) 2 mysql内连接和外连接的区别 内连接只会保留完全符合关联条件的数据 外连接会保留表…

antv/x6节点添加鼠标悬浮高亮和删除功能

antv/x6节点添加鼠标悬浮高亮和删除功能 效果鼠标悬浮高亮鼠标移出恢复原状态 效果 鼠标悬浮高亮 this.graph.on(node:mouseenter, ({ node }) > {node.addTools({name: button-remove,args: {x: 100%,y: 0,offset: { x: 0, y: 0 },},})})鼠标移出恢复原状态 this.graph.on(…

如何实现冻干机和产品全生命周期的验证和监测?

为什么冻干需要工艺优化和合规性 冻干是制药和生物技术产品的关键工艺&#xff0c;需要精确控制关键的温度和压力参数。通过遵守 GMP 和 FDA 合规性等监管准则&#xff0c;您可以生产出更高质量的产品&#xff0c;避免不必要的浪费&#xff0c;并缩短产品上市时间。 要想在冻干…

Java on Azure Tooling 2024年1月更新|Azure Key Vault 支持、示例项目创建支持及更多

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division At Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 2024 年 Java on Azure 工具的首次更新。在本次更新中&#xff0c;我们将介绍对于 Azure Key Vault 支持、基于 Azure 示例项目的创建支…

【面试】冲刺春招!每天三十道面试题——Java基础篇(一)

目录 一 JDK 和 JRE 的区分 二 简述编码的作用以及记事本的实现原理 三 基本类型有哪些&#xff1f;分别占据多少空间&#xff1f; 四 java中布尔类型的空间大小是怎么定下来的&#xff1f;为什么不是1bit&#xff0c; 把考虑因素说一下 五 int类型和float类型哪一个精度更…

nohost本地部署

1、安装node Node.js 官方网站下载&#xff1a;https://nodejs.org/en/download/ 2、安装whistle 安装命令为 npm install -g whistle 或 npm install -g cnpm --registryhttps://registry.npm.taobao.org 后&#xff0c;使用 cnpm install -g whistle 来安装 3、插件修改 官方…

BUG:docker启动之后直接退出问题

示例如下&#xff1a; 问题排查&#xff1a; 启动命令 sudo docker run --privilegedtrue --runtimenvidia --shm-size80g -v /mmm_data_center:/mmm_data_center -v /imagecenter_new/:/imagecenter_new -v /data1:/data1 -v /mnt/offline_data/:/mnt/offline_data/ --neth…

cesium-测量高度垂直距离

cesium做垂直测量 完整代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-i…

【51单片机】直流电机实验和步进电机实验

目录 直流电机实验直流电机介绍ULN2003 芯片介绍硬件设计软件设计实验现象 步进电机实验步进电机简介步进电机的工作原理步进电机极性区分双极性步进电机驱动原理单极性步进电机驱动原理细分驱动原理 28BYJ-48 步进电机简介软件设计 橙色 直流电机实验 在未学习 PWM 之前&…

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下&#xff0c;智慧城市作为未来城市发展的先锋方向&#xff0c;正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志&#xff0c;更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…

玩家笔记:幻兽帕鲁搭建服务器开服教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

高频一体式读写器现场应用

一体式读写器将所有组件集成在一个设备内&#xff0c;具有设计紧凑、安装简单、一体读写的特点&#xff0c;可在生产、仓库等领域中应用。高频一体式读写器现场应用 一体式读写器可以在在工业生产线上应用&#xff0c;读取产线设备的各种信息并记录&#xff0c;实现自动化控制和…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料&#xff1a; TensorRT 源码示例 B站视频&#xff1a;TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码&#xff1a;cookbook → 07-Tool → trtexec 官方文档&#xff1a;trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…