您当前的位置: 首页 > 

liaowenxiong

暂无认证

  • 2浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

XML的学习

liaowenxiong 发布时间:2021-12-15 16:45:20 ,浏览量:2

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

2.指令 引入 css 文件,用于展示 xml 文件的内容

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

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

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

格式:

XML 约束

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

DTD

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

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

名称解释

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

引用内部的 DTD

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



DOCTYPE 书籍列表[
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        ]>
引用外部的 DTD

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

如果 DTD 文件在项目中: 如果 DTD 文件在网络中:

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 则引用某个命名空间,这个命名空间指向某个资源文件。

例如:


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 中的定义。

命名空间前缀的意义


    
        刘德华
        11
        male
    

    
        张学友
        11
        male
    

如上所示,xml 文档中引入两个 Scheme 定义文件,而这两个文件中都定义了标签 ,那么你要使用哪个 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文件的Path
        String 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继承自ArrayList
        Elements 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

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

关注
打赏
1661566967
查看更多评论
立即登录/注册

微信扫码登录

0.0456s