XML的学习

文章目录

  • XML 简介
  • XML 语法
  • XML 组成部分
  • XML 约束
    • DTD
      • 名称解释
      • 引用内部的 DTD
      • 引用外部的 DTD
    • Schema
      • 语法格式详解
      • 命名空间前缀的意义
  • XML 解析
    • 解析 XML 的方式(思想)
    • 解析器
      • JSOUP 的使用
        • JSOUP 入门
  • 快捷查询
    • Jsoup 选择器查询
    • XPath

XML 简介

XML,Extensible Markup Language,可扩展标记语言。
可扩展,主要是指标签完全由用户自定义。

功能:存储数据
1.配置文件
2.在网络中传输

xml 与 html 的区别:
1.xml 标签都是自定义的,html 标签是预定义
2.xml 的语法严格,html 语法松散
3.xml 是存储数据的,html 是展示数据

XML 语法

语法规则:
1.xml 文档的后缀名.xml
2.xml 第一 行必须定义为文档声明
3.xml 文档中有且仅有一个根标签
4.后性值必须使用引号(单双都可)引起来
5.标签必须正确关闭
6.xml标签名称区分大小写

XML 组成部分

1.文档声明

1.1.格式:<?xml 属性列表 ?>
1.2.属性列表:
version:版本号,必须的属性
encoding:指定解码的字符编码。告知解析引擎需要使用什么字符编码解码文档,默认值: ISO- 8859-1
standalone:是否独立。取值 yes:不依赖其他文件;取值 no:依赖其他文件。这个了解即可。

2.指令
引入 css 文件,用于展示 xml 文件的内容
<?xml-stylesheet type="text/css" href="demo.css" ?>

3.标签
自定义标签名称,命名规则和 HTML 相同

4.属性
id 属性值必须唯一

5.文本
CDATA区:在该区域中的数据会被原样展示

格式:<![CDATA[ 数据 ]]>

XML 约束

作为框架的使用者(程序员) :
1.能够在 xml 中引入约束文档
2.能够简单的读懂约束文档
在这里插入图片描述
约束分类:
1.DTD:一种简单的约束技术
2.Schema:一种复杂的约束技术

DTD

引入 DTD 可以使用两种方式,引用内部定义的 DTD 和引用外部的 DTD 文档。

内部 DTD:将约束规则定义在 XML 文档中
外部 DTD:将约束的规则定义在外部的 DTD 文件中

名称解释

#PCDATA:表示元素的内容是普通文本
CDATA:表示属性值的类型是字符串类型
#REQUIRED:表示属性是必须的
ID:表示属性值是唯一的
#IMPLIED:表示属性非必须的,即可有可无

引用内部的 DTD

下面的范例就是引用内部的 DTD:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="demo.css"?>
<!DOCTYPE 书籍列表[<!-- 定义一个标签,名称叫"书籍列表",里面包含标签"武侠小说"和"computer_book",并且"武侠小说"和"computer_book"可以出现任意个(≥0)--><!ELEMENT 书籍列表 (武侠小说*,computer_book*)><!-- 定义一个标签,名称叫武侠小说,里面包含标签书名、作者、价格、册数、简介,要求出现的顺序必须一致,而且每个标签只能有1个,而且必须有--><!--作者+,表示作者标签可以有1个或者多个--><!--简介?,表示简介标签可以有0个或者1个--><!ELEMENT 武侠小说 (书名,作者+,价格,册数,简介?)><!ELEMENT computer_book (book_name,author,price,copies,profile)><!--(phone|mobile)*,表示可以出现phone或者mobile,或者两者都出现,可以出现多次--><!ELEMENT 作者 (name,(phone|mobile)*)><!ELEMENT name (#PCDATA)><!ELEMENT phone (#PCDATA)><!ELEMENT mobile (#PCDATA)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 价格 (#PCDATA)><!ELEMENT 简介 (#PCDATA)><!ELEMENT 册数 (#PCDATA)><!ELEMENT book_name (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)><!ELEMENT copies (#PCDATA)><!ELEMENT profile (#PCDATA)><!--表示武侠小说标签有属性isbn,且是必须的。REQUIREd表示必须,IMPLIED非必须,ID表示属性值唯一;有属性hot,默认值false--><!ATTLIST 武侠小说isbn CDATA ID #REQUIREddate CDATA #REQUIREdhot CDATA "false">]>

引用外部的 DTD

DTD 可以独立成文档,在 XML 文档中引入 DTD 文档,引入语法格式:

如果 DTD 文件在项目中:<!DOCTYPE 根标签名 SYSTEM "DTD文件的路径">
如果 DTD 文件在网络中:<!DOCTYPE 根标签名 PUBLIC "DTD文件名称" "DTD文件的URL">

DTD类型:
PUBLIC,行业共用的
SYSTEM,系统本地的,自定义的

Schema

语法格式详解

xmlns:namespace-prefix="namespace",其中的 namespace-prefix 可以省略掉。namespace-prefix 叫做命名空间前缀,其实相当于变量,用来引用某个命名空间。

xmlns 是 XML Namespace 的缩写,译为 XML 命名空间。命名空间可理解为某种资源的别名,用来区分、识别不同的引用资源。

xmlns:xsi 表示使用 xsi 来引用指定的命名空间,而这个 xsi 在 XML 中叫做命名空间前缀。

xsiXML Schema Instance,含义是 Schema 的实例,Schema 是一种约束技术,所谓实例就是这种技术的具体实现,所以 xsi 是用来引用 Schema 技术的具体实现的。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 表示使用 xsi 引用命名空间 http://www.w3.org/2001/XMLSchema-instance

Schema 技术的具体实现有很多,如下图所示:
在这里插入图片描述

xsi:schemaLocation 属性定义了 XML Namespace 和 XSD(Xml Schema Definition)文档的对应关系。它的值由一个或多个URL引用对组成,命名空间与 XSD 文件之间,以空格和换行分隔。第一个 URL 是 XSD 文件的 XML Namespace 的值,第二个 URL 则是 Schema 文档的位置,XML 引擎将从这个位置读取 Schema 文档,该文档的 targetNamespace 必须与第一个 URL 相匹配。

xsi:schemaLocation 属性是来自于某个具体的 Schema 技术实现,xsi 则引用某个命名空间,这个命名空间指向某个资源文件。

例如:

<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.itcast.cn/xml"xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">

xsi 引用 http://www.w3.org/2001/XMLSchema-instancehttp://www.w3.org/2001/XMLSchema-instance 是一种 Schema 的具体技术实现。

xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"xsi:schemaLocation 属性是来自于前缀 xsi 的,而前缀 xsi 引用 http://www.w3.org/2001/XMLSchema-instance,所以 schemaLocation 属性其实是来自于 http://www.w3.org/2001/XMLSchema-instance,也就是说在 http://www.w3.org/2001/XMLSchema-instance 中定义了属性 schemaLocation

schemaLocation 的值是 http://www.itcast.cn/xml student.xsd,说明 XML 具体使用的 Schema 定义文档时是 sutdent.xsd,而且这个文档的命名空间是 http://www.itcast.cn/xml,那么就可以通过 http://www.itcast.cn/xml 来引用文档 sutdent.xsd

xmlns="http://www.itcast.cn/xml",这个表示标签没有前缀的情况下默认引用的命名空间是 http://www.itcast.cn/xml,而这个命名空间指向的是 sutdent.xsd,所以标签没有前缀的情况下默认使用 sutdent.xsd 中的定义。

命名空间前缀的意义

<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.itcast.cn/xml"xmlns:a="http://www.itcast.cn/xml2"xsi:schemaLocation="http://www.itcast.cn/xml student.xsdhttp://www.itcast.cn/xml2 student2.xsd"><student number="heima_0001"><name>刘德华</name><age>11</age><gender>male</gender></student>
<!--这个student标签使用的是student2.xsd的定义--><a:student number="heima_0002"><a:name>张学友</a:name><a:age>11</a:age><a:gender>male</a:gender></a:student>
</students>

如上所示,xml 文档中引入两个 Scheme 定义文件,而这两个文件中都定义了标签 <student><name><age><gender>,那么你要使用哪个 XSD 文档定义的标签呢?你可以在标签前面加上前缀进行标识,这样 XML 引擎就知道要依据哪个 XSD 进行解析判断了。

XML 解析

操作 XML 文档:
所谓解析,就是读取数据(input/输入),将 XML 文档中的数据读取到内存中。
写入数据(output/输出),就是将内存中的数据保存到 XML 文档中,即所谓的持久化存储。

解析 XML 的方式(思想)

1.DOM
将标记语言文档一次性加载进内存中,在内存中形成一棵 DOM 数。适用于服务器等设备

优点:操作非常方便,可以对文档进行 CRUD 的所有操作
缺点:比较消耗内存

2.SAX
逐行读取,基于事件驱动,适用于内存空间小设备,例如:手机

优点:不占内存
缺点:只能读取,不能增删改

解析器

根据 DOM 或者 SAX 思想实现的工具包。
1.JAXP:sun 公司提供的解析器,支持 DOM 和 SAX 两种思想,很少使用
2.DOM4J:优秀的解析器,基于 DOM 思想实现,在服务器端常用
3.jsoup:一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4.PULL:安卓系统内置的解析器,基于 SAX 思想实现

JSOUP 的使用

步骤:
1.导入 jar 包
2.获取 Document 对象,这个对象代表整个 DOM 树结构
3. 获取对应的标签(即 Element 对象)
4. 获取数据

JSOUP 入门

package pri.lwx.javaex.xmlex.jsoup;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import java.io.File;
import java.io.IOException;/*** Jsoup快速入门** @author liaowenxiong* @date 2021/12/14 11:53*/public class JsoupDemo01 {public static void main(String[] args) throws IOException {// 获取XML文件的PathString path = JsoupDemo01.class.getClassLoader().getResource("pri/lwx/javaex/xmlex/schema/student.xml").getPath();// 解析XML文档,加载文档进内存,获取dom树(Document对象)// parse方法需要指定解码的编码格式Document doc = Jsoup.parse(new File(path), "utf-8");// 获取元素对象// getElementsByTag通过标签名获取元素对象集合// Elements继承自ArrayListElements elements = doc.getElementsByTag("name");// 查看集合的长度System.out.println("元素集合长度:" + elements.size());// 获取集合的第一个元素对象Element element = elements.get(0);// 获取集合对象中的文本数据String name = element.text();System.out.println(name);}
}

对象的说明:
1.Jsoup
工具类,可以解析 html 或者 xml 文档,返回 Document 对象
parse(File in, String charsetName):解析 XML 和 HTML 文件
parse(String html):解析 HTML 和 XML 字符串
parse(URL url, int timeoutMillis):通过指定的网络资源路径获取对应的文档对象

2.Document
文档对象,代表内存中的dom树
Document 继承自 Element
通过 Document 对象获取 Element 对象或者 Element 对象集合

getElementsByTag(string tagName) :根据标金名称获取元素对家集合
getElementsByAttribute(String key) :根据属性名称获取元素对象集合
getElementsByAttributevalue(String key, String value) :根据属性名和属性值获取元素对象集合
getElementsByClass(String classValue):根据 class 属性值获取元素对象集合
getElementById(String id):根据ID值获取元素对象

3.Elements
Element 对象的集合,本质是 ArrayList<Element>

4.Element
元素对象
4.1.可以获取子元素对象
4.2.可以获取元素的属性值
public String attr(String attributeKey):根据属性名获取对应的属性值
4.3.可以获取元素的文本内容
public String text():获取元素的文本内容,包含子元素中的文本内容
public String html():获取元素的innerHTML内容,即标签体中所有的内容

5.Node
节点对象,Node 是 Element 的父类

快捷查询

Jsoup 选择器查询

public Elements select(String cssQuery)

参考 Selector 类中定义的语法

示例代码:

package pri.lwx.javaex.xmlex.jsoup;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.File;
import java.io.IOException;/*** Jsoup的选择器查询** @author liaowenxiong* @date 2021/12/15 10:19*/public class JsoupDemo04 {public static void main(String[] args) throws IOException {// 获取xml文件的绝对路径String path = JsoupDemo04.class.getClassLoader().getResource("pri/lwx/javaex/xmlex/schema/student.xml").getPath();// 获取xml文件对应的Document对象Document document = Jsoup.parse(new File(path), "utf-8");// 使用标签选择器(类似css的标签选择器)获取所有名称为student的元素Elements elements = document.select("student");System.out.println(elements);System.out.println("-----------------");// 使用属性值选择器获取所有number属性值为heima_0001的student元素Elements elements1 = document.select("student[number='heima_0001']");System.out.println(elements1);System.out.println("-----------------");// 使用属性值选择器+后代选择器,获取所有number属性值为heima_0001的student元素所包含的name元素Elements elements2 = document.select("student[number='heima_0001'] name");System.out.println(elements2);System.out.println("-----------------");}
}

XPath

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

使用 XPath 需要导入相关的 jar 包:

JsoupXpath-2.5.1.jar
slf4j-jdk14-1.6.1.jar
slf4j-api-1.7.32.jar
antlr4-runtime-4.7.2.jar
commons-lang3-3.12.0.jar

主页:https://github.com/zhegexiaohuozi/JsoupXpath
教程:https://www.w3school.com.cn/xpath/index.asp

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

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

相关文章

php 日期多余小时,在PHP中添加小时到日期时间

DateTime是PHP中的一个很棒的功能$string 1/1/2016 11.00PM;$date new DateTime($string);$interval new DateInterval(PT6H);$date->add($interval);// Now add another 6 hours while we are between 12:00 AM and 6:00 AMwhile($date->format(G) > 0 &&…

streaming api_通过Spring Integration消费Twitter Streaming API

streaming api1.概述 众所周知&#xff0c; Spring Integration具有用于与外部系统交互的大量连接器。 Twitter也不例外&#xff0c;而且很长一段时间以来&#xff0c;因为Spring Social一直是一个开箱即用的解决方案&#xff0c;Spring Integration利用该解决方案来连接到社交…

Linux命令之 mount -- 文件系统挂载

文章目录简介参考实例加载指定的分区参考简介 mount 命令用于加载文件系统到指定的加载点。此命令的最常用于挂载 cdrom&#xff0c;使我们可以访问 cdrom 中的数据&#xff0c;因为你将光盘插入 cdrom 中&#xff0c;Linux 并不会自动挂载&#xff0c;必须使用 Linux mount 命…

java 舍,java 4舍六入五成双

java 四舍六入五成双1. 小于5舍去&#xff0c;即舍去部分的数值小于保留部分的末位的半个单位&#xff0c;则末位不变&#xff1b;2. 大于5进1&#xff0c;即舍去部分的数值大于保留部分的末位的半个单位&#xff0c;则末位加1&#xff1b;3. 等于5时取偶数&#xff0c;即舍去部…

Linux命令之 umount -- 卸载文件系统

文章目录介绍参考介绍 umount 是“unmount”的缩写&#xff0c;译为“不挂载。所以它的”的作用是卸载已挂载的文件系统、目录或文件。 利用设备名或挂载点都能umount文件系统&#xff0c;不过最好还是通过挂载点卸载&#xff0c;以免使用绑定挂载&#xff08;一个设备&#x…

aws技术峰会2018_AWS re:Invent 2018的5大公告

aws技术峰会2018AWS re&#xff1a;Invent刚刚完成。 这是一个巨大的活动&#xff0c;在拉斯维加斯7家最大的酒店中&#xff0c;有50,000多名与会者&#xff0c;并发布了许多新的服务公告。 无服务器端通过新的lambda增强功能和更好的容器支持继续受到很多关注。 AWS通过新的“…

php 降低图像大小,PHP图像重新调整大小

我有一个PHP脚本,可以重新调整JPEG图像的大小.但是,由于某种原因,图像被扭曲,即使我将其编程为按比例计算x或y(取决于照片方向).质量是100,所以我不明白为什么它会使它们扭曲.我究竟做错了什么&#xff1f;编辑原始图像为3264px x 2448px谢谢代码&#xff1a;$im ImageCreateF…

Linux命令之 mke2fs -- 格式化分区(为分区写入文件系统)

文章目录简介命令选项参考实例格式化指定的分区简介 在磁盘分区上创建 ext2、ext3、ext4 等文件系统&#xff0c;默认情况下会创建 ext2。 虽然 mkfs 命令非常简单易用&#xff0c;但其不能调整分区的默认参数&#xff08;比如块大小是 4096 Bytes&#xff09;&#xff0c;这…

Linux格式化分区的命令

查看系统所有的文件系统&#xff1a; [~]$ df -ah Filesystem Size Used Avail Capacity iused ifree %iused Mounted on /dev/disk1s5s1 234Gi 15Gi 65Gi 19% 575614 682553320 0% / devfs 190Ki 190Ki 0Bi 100% 658 …

java jwt 验证_教程:用Java创建和验证JWT

java jwt 验证“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java对JWT&#xff08;JSON Web令牌&#xff09;的支持过去需要进行大量…

php网页布局边框,用CSS来设置网页当中的边框

摘要&#xff1a;跟着老师视频做的一个css边框小练习 css——边框 &nbs跟着老师视频做的一个css边框小练习 css——边框 .box{width:100px;height:100px;border:1px solid #ccc;border-radius:20px;}.main{width:100px;height:100px;border-top: 1px s…

Linux命令之 mkfs -- 在特定的分区创建 Linux 文件系统

文章目录简介选项参考示例在 /dev/hda5 上建一个 msdos 的文件系统&#xff0c;同时检查是否有坏轨存在&#xff0c;并且将过程详细列出来&#xff1a;将指定分区格式化成各种类型的文件系统简介 该命令用来在特定的分区创建 Linux 文件系统&#xff0c;常见的文件系统有 ext2…

本地线程分配缓冲_线程本地分配缓冲区

本地线程分配缓冲最近&#xff0c;我一直在研究遭受严重性能问题的Java应用程序。 在许多问题中&#xff0c;真正引起我注意的一个问题是新对象的分配速度相对较慢&#xff08;应用程序分配了大量的相当大的对象&#xff09;。 后来发现&#xff0c;原因是大量的分配发生在TLAB…

mysql 触发器计算总价,mysql’插入’触发器根据其他字段计算字段

我正在尝试创建一个触发器,它将根据用户输入的lat / lng列更新GEOMETRY列.我的触发器看起来像这样 –CREATE TRIGGER tbl.fooAFTER INSERT ON tbl FOR EACH ROWBEGINUPDATE tblSET coord Point(lng, lat)WHERE id NEW.id;END但是,当我插入一个带有lng,lat值的新行时,我收到以…

oracle连接外部数据库_使用Oracle验证外部数据

oracle连接外部数据库我经常在Corda Slack频道中闲逛&#xff0c;并尽可能回答问题。 我尝试回答的合理数量的问题与Oracle有关。 更具体地说&#xff0c;何时使用。 我觉得我可以回答&#xff0c;“当您需要验证可能经常更改的外部数据时使用Oracle”。 我大概在某个时候写了一…

macOS如何格式化移动硬盘和U盘

1.打开磁盘工具 2.在左侧选择要格式化的外置磁盘设备&#xff0c;接着在右上角点击【抹掉】 3.点击【抹掉】会弹出如下的对话框&#xff0c;在格式中建议选择 ExFAT 格式&#xff0c;这是一个在 Windows 和 macOS 都可以使用的文件系统格式 选择好要格式化的文件系统格式后&…

macOS查看IP地址的命令

查看内网的 IP 地址&#xff1a; [~]$ ipconfig getifaddr en0 192.168.30.25 # 或者 [~]$ ifconfig en0 en0: flags8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500options400<CHANNEL_IO>ether d4:61:9d:11:c2:94 inet6 fe80::cbc:309b:57a4:5cf6…

mysql注入漏洞语句,web安全之sql注入漏洞

概念通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。通俗地讲&#xff0c;它是利用现有应用程序&#xff0c;将(恶意)的SQL命令注入到后台数据库引擎执行的能力&#xff0c;它可以通过在Web表单中输入(恶意…

ssrs 基于表达式显示_基于表达式的访问控制

ssrs 基于表达式显示1.概述 今天&#xff0c;我们将回顾基于表达式的访问控制&#xff08;EBAC&#xff09;&#xff0c;基于角色的访问控制&#xff08;RBAC&#xff09;和基于属性的访问控制&#xff08;ABAC&#xff09;之间的区别&#xff0c;并将重点放在EBAC上。 2.什么…

macOS下载、安装、使用tomcat服务器及IntelliJ IDEA for Mac 如何集成、配置、运行tomcat

文章目录web 服务器软件tomcat如何下载安装 tomcatmacOS 下如何启动 tomcatWindows 启动 tomcat部署项目的方式直接将项目放到 webapps 目录下即可在 tomcat 的配置文件 server.xml 中进行配置部署在 tomcat 的 localhost 目录下通过 xml 文件完成部署IntelliJ IDEA 集成 tomca…