XML基本入门

1.XML概述

1.1 基本概念

  可扩展标记语言(Extensible Markup Language,XML),可扩展意味着标签是自定义的。XML主要用来存储数据、作为配置文件、在网络中传输等。

1.2 XML和HTML区别

(1)XML标签是自定义的,HTML标签是预定义的。
(2)XML的语法严格,HTML语法松散。
(3)XML是存储数据的,HTML是展示数据的。

2.XML语法

2.1 XML基本语法

(1)xml文档的后缀名为 .xml。
(2)xml第一行必须定义为 文档声明。
(3)xml文档中有且仅有一个根标签。
(4)属性值必须使用单引号(单双都可)引起来。
(5)xml标签必须正确关闭,也即要么是自闭和标签,要么是围堵标签。
(6)xml标签名称区别大小写。

<?xml version="1.0" encoding="utf-8" ?>

<users>
	<user id = '1'>
		<name>zhangsan</name>
		<age>23</age>
		<gender>male</gender>
	</user>
        
	<user id = '2'>
		<name>lisi</name>
		<age>22</age>
        <gender>female</gender>
	</user>
</users>

2.2 XML组成部分

(1)文档声明

  • 格式:<?xml 属性标签 ?>
  • 属性列表:
    ① version:版本号(必须)
    ② encoding:编码方式,告知解析引擎当前文档使用的字符集或编码方式,默认为 ISO-8859-1。
    ③ standalone:是否独立,取值为yes或no。yes表示不依赖其他文件,no依赖其他文件。(基本不设置)
<?xml version="1.0" encoding="utf-8" ?>

(2)指令(了解):用来结合CSS去控制标签样式的。
(3)标签:标签名称是自定义的,其定义规则如下:
  ① 名称可以包含字母、数字以及其他字符;
  ② 名称不能以数字或标点符号开始;
  ③ 名称不能以字母xml(或者XML、Xml等)开始;
  ④ 名称不能包含空格。
(4)标签属性
  id属性值唯一。
(5)文本内容
  主要介绍CDATA区,在该区域中的数据会被原样展示,格式为:<![CDATA[数据]]>
  在这里插入图片描述

3.XML约束

3.1 约束概念

(1)约束是规定xml文档的书写规则,作为框架的使用者(程序员)需要能够在xml中引入约束文档,再简单的读懂约束文档。
(2)用户(程序员)主要是编写xml来使用半成品软件(框架),而框架则需要解析程序员编写的xml。框架的设计者为了保证程序员知道应该写那些内容来使用框架,在编写框架后,也编写一份说明文档来规定xml文档的书写规则,也就是约束文档。因此,对于程序员来说,只需要能够读懂约束文档即可。
在这里插入图片描述

3.2 约束技术

(1)约束技术分类

  • DTD:一种简单地约束技术(有缺陷)
  • Schema:一种复杂的约束技术

(2)DTD约束技术

  • 引入dtd约束文档到xml文档中方法:
    ① 内部dtd:将约束规则定义在xml文档中。(基本不用)
    ② 外部dtd:将约束规则定义在外部的dtd文件中。外部dtd又分为两类,一类是本地dtd文件,一类是网络dtd文件。其中:
      本地dtd引入:<!DOCTYPE 根标签名 SYSTEM "dtd文件的位置">
      网络dtd引入:<!DOCTYPE 根标签名 PUBLIC "dtd文件名字" "dtd文件的位置URL">
  • DTD约束技术的缺陷在于定义dtd文档时,无法定义每个标签内容的书写格式、数字字母范围等。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">

<students>
   <student number="s001">
      <name></name>
      <age></age>
      <sex></sex>
   </student>
</students>

(3)Schema约束技术
  ① 填写xml文档的根元素
  ② 引入xsi前缀,如 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
  ③ 引入xsd文件的命名空间,如 xsi:schemaLocation=“http://www.ecarg.cn/xml student.xsd”
  ④ 为每一个xsd约束声明一个前缀作为标识,如 xmlns=“http://www.ecarg.cn/xml” 其中,xmlns为xml namespace,xml的命名空间。
  当xml中只引入一个xsd文件时,可以使用空标识以方便定义符合xsd文档的xml文件。
  当xml中引入多个xsd文件时,为了定义xml文件时,区别不同的xsd文档,需要用xmlns:标识名="http://www.ecarg.cn/xml"的方式,为各个命名空间定义不同的标识。

<?xml version="1.0" encoding="UTF-8" ?>

<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
        xmlns="http://www.itcast.cn/xml"
         >
   <student number="heima_0001">
      <name>zhangsan</name>
      <age>11</age>
      <sex>male</sex>
   </student>
</students>

4.xml解析

4.1 概述

  解析也就是操作xml文档,将文件中的数据读取到内存中。其中,操作xml文档分为解析(读取)和写入操作。解析操作就是将文档中的数据读取到内存中;写入操作就是将内存中的数据保存到xml文档中,持久化存储。

4.2 解析xml的方式(思想)

(1)DOM:将标记语言文档一次性加载进内存,在内存中形成一棵DOM树。
  优点:操作方便,可以对文档进行CRUD的所有操作。
  缺点:一次性加载文档并形成DOM树比较占内存。
(2)SAX:逐行读取,是基于事件驱动的。
  优点:不占内存,可以适用于内存较小的设备(如手机)。
  缺点:只能用来读取,不能增删改。
  因此,根据DOM和SAX的优缺点,DOM一般用在服务器端的开发上,SAX一般用于Android等移动端的开发上。

4.3 xml常见的解析器

(1)JAXP:sun公司提供的解析器,支持DOM和SAX两种解析思想。(性能较差,基本不用)
(2)DOM4J
(3)Jsoup:Jsoup是一款Java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可以通过DOM、CSS以及类似于JQuery的操作来取出和操作数据。
(4)PULL:Android操作系统内置的解析器,SAX方式的。

4.4 Jsoup解析器使用方式

4.4.1 使用步骤(入门)

(1)导入jar包,如 jsoup-1.11.2.jar
(2)获取Document对象
(3)获取对应标签的Element对象
(4)获取数据
student.xml

<?xml version="1.0" encoding="UTF-8" ?>

<students>
   <student number="wang_0001">
      <name>zhangsan</name>
      <age>11</age>
      <sex>male</sex>
   </student>


   <student number="wang_0002">
      <name>lisi</name>
      <age>13</age>
      <sex>female</sex>
   </student>
</students>

JsoupDemo1.java

package cn.ecarg.xml.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入门
*/
public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //1.获取Document对象,根据xml文档获取
        //1.1获取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //1.2 解析xml,加载文档进内存,获取dom树(dom树对应的就是Document对象)
        Document document = Jsoup.parse(new File(path), "utf-8");
        //2.用dom树对象document获取元素对象Element
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());
        //2.1 获取第一个name的Element对象
        Element element = elements.get(0);
        //2.2 获取数据
        String name = element.text();
        System.out.println(name);
    }
}

4.4.2 Jsoup对象的使用

(1)Jsoup:工具类,可以解析html和xml文档,返回Document。
  parse():解析html和xml文档,返回Document对象。

static Document parse(File in, String charsetName):解析xml或html文件的方法。
static Document parse(String html):解析字符串的方法。
static Document parse(URL url, int timeoutMillis):通过网络路径获取指定的html或xml的文档。

(2)Document:文档对象,代表内存中的DOM树。(Document继承自Element)
  获取DOM树中任意的Element对象。

Element getElementById(String id):根据id属性值获取唯一的element对象。
Elements getElementsByTag(String tagName) :根据标签名称获取元素对象集合
Elements getElementsByAttribute(String key):根据属性名称获取元素对象集合
Elements getElementsByAttributeValue(String key, String value):根据对应的属性名称和属性值获取对象集合

(3)Elements:文档Element对象的集合,可以当做 ArrayList<Element>来使用。
(4)Element:元素对象
  ① 只获取自己的子元素对象。

Element getElementById(String id):根据id属性值获取唯一的element对象。
Elements getElementsByTag(String tagName) :根据标签名称获取元素对象集合
Elements getElementsByAttribute(String key):根据属性名称获取元素对象集合
Elements getElementsByAttributeValue(String key, String value):根据对应的属性名称和属性值获取对象集合

  ② 获取属性值

String attr(String attributeKey):根据属性名称来获取属性值。

  ③ 获取文本内容

String text():获取所有子标签的纯文本内容
String html():获取标签体的所有内容(包括子标签和文本内容字符串)

(5)Node:节点对象(Document和Element的父类)

4.4.3 Jsoup的快捷查询方式

(1)selector:选择器
  Elements select(String cssQuery);
  语法:参考Selector类中定义的语法。
在这里插入图片描述

package cn.ecarg.xml.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;

/**
* 选择器查询
*/
public class JsoupDemo3 {
    public static void main(String[] args) throws IOException {
        //1.获取Document对象,根据xml文档获取
        //1.1获取student.xml的path
        String path = JsoupDemo3.class.getClassLoader().getResource("student.xml").getPath();
        //1.2 解析xml,加载文档进内存,获取dom树(dom树对应的就是Document对象)
        Document document = Jsoup.parse(new File(path), "utf-8");

        //2.查询name标签
        Elements elements = document.select("name");
        System.out.println(elements);

        System.out.println("***********************");

        //3.查询id值为ecarg的元素
        Elements elements1 = document.select("#ecarg");
        System.out.println(elements1);

        System.out.println("***********************");

        //4.获取student标签且number属性值为wang_0001的age子标签
        //4.1 获取student标签且number属性值为wang_0001
        Elements elements2 = document.select("student[number='wang_0001']");
        //4.3 获取age子标签
        Elements elements3 = document.select("student[number='wang_0001'] > age");
        System.out.println(elements3);
    }
}

(2)XPath:XPath为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。

  • 使用Jsoup的XPath,导入jar包,如 JsoupXpath-0.3.2.jar。
  • 查询w3chool参考手册,使用XPath的语法完成查询。
    在这里插入图片描述
package cn.ecarg.xml.jsoup;

import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
* XPath查询
*/
public class JsoupDemo4 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //1.获取Document对象,根据xml文档获取
        //1.1获取student.xml的path
        String path = JsoupDemo4.class.getClassLoader().getResource("student.xml").getPath();
        //1.2 解析xml,加载文档进内存,获取dom树(dom树对应的就是Document对象)
        Document document = Jsoup.parse(new File(path), "utf-8");

        //2.根据Document对象,创建JXDocument对象
        JXDocument jxDocument = new JXDocument(document);

        //3.结合xpath语法查询
        //3.1 查询所有的student标签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
            System.out.println("********************");
        }

        //3.2 查询所有student标签下的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student//name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
            System.out.println("********************");
        }

        //3.3 查询所有student标签下带有id属性的name标签
        List<JXNode> jxNodes3 = jxDocument.selN("//student//name[@id]");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
            System.out.println("********************");
        }

        //3.4 查询所有student标签下带有id属性的name标签 且 id属性值为ecarg
        List<JXNode> jxNodes4 = jxDocument.selN("//student//name[@id='ecarg']");
        for (JXNode jxNode : jxNodes4) {
            System.out.println(jxNode);
            System.out.println("********************");
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 作者简介 前言 第1章 XML简介 1.1 标记语言 1.2 XML的起源和目的 1.3 Web体系结构:过去与未来 1.3.1 传统Web体系结构 1.3.2 XML下的Web体系结构 1.4 XML基本特征 1.5 词汇表 1.5.1 科学词汇表 1.5.2 商业词汇表 1.5.3 法律词汇表 1.5.4 医学词汇表 1.5.5 计算机词汇表 1.6 XML技术的主要特性 1.6.1 格式正规的XML 1.6.2 文档类型定义 1.6.3 数据建模 1.6.4 文档对象模型 1.6.5 XML 简单API 1.6.6 命名空间和模式 1.6.7 链接和查询 1.6.8 转换XML 1.6.9 XML和数据库 1.6.10 服务器到服务器 1.6.11 电子商务与XML 1.6.12 使用样式 1.6.13 无线应用程序协议和WML 1.7 XML的应用程序举例 1.8 小结 第2章 XML语法 2.1 标记语法 2.1.1 字符 2.1.2 命名 2.2 文档部分 2.3 元素 2.3.1 起始标记 2.3.2 结束标记 2.3.3 空元素标记 2.3.4 标记:一个简单的例子 2.3.5 文档元素 2.3.6 子元素 2.3.7 元素嵌套 2.3.8 字符串 2.4 字符数据 2.5 属性 2.5.1 特殊属性 2.5.2 空白 2.5.3 行尾的处理 2.6 字符引用和实体引用 2.6.1 字符引用 2.6.2 实体引用 2.7 处理指令 2.8 注释 2.9 CDATA部分 2.10 文档结构 2.10.1 序言 2.10.2 尾声 2.11 XML语法小结 2.12 格式正规的文档 2.13 解析器 2.13.1 事件驱动的解析器 2.13.2 基于树的解析器 2.13.3 解析器基准测试 2.14 书籍目录应用程序 2.15 小结 第3章 文档类型定义 3.1 为何需要正式的结构 3.1.1 文档域 3.1.2 验证文档的有效性 3.2 编写DTD:通用原则 3.2.1 将DTD与XML文档相关联 3.2.2 基本标记声明 3.3 正式的DTD结构 3.3.1 实体 3.3.2 元素 3.3.3 属性 3.3.4 条件部分 3.4 DTD的缺点 3.5 用于图书目录问题的DTD 3.5.1 图书目录问题的正式定义 3.5.2 对象关系问题 3.5.3 进一步讨论 3.6 小结 第4章 数据建模与XML 4.1 信息建模 4.1.1 静态模型和动态模型 4.1.2 文档和数据 4.1.3 从何处开始 4.1.4 静态信息模型 4.1.5 动态建模:对数据进行哪些处理? 4.2 设计XML文档 4.2.1 XML的两种角色 4.2.2 将信息模型映射到XML 4.3 模式语言和表示法 4.3.1 模式的作用 4.3.2 将DTD作为模式 4.3.3 XML模式建议 4.4 小结 第5章 文档对象模型 5.1 什么是文档对象模型 5.1.1 XML文档结构 5.1.2 为何使用DOM 5.1.3 DOM规范 5.1.4 现实世界中的DOM 5.1.5 特殊的XML DOM实例— HTML DOM 5.2 使用DOM 5.2.1 DOM API 5.2.2 客户端和服务器端 5.2.3 DOM在出版过程中的应用 5.3 使用DOM和XML的应用实例 5.3.1 简单的客户端实例 5.3.2 更复杂的编程实例 5.4 DOM和XML的未来 5.4.1 W3C的工作 5.4.2 应用 5.4.3 数据库、模式和DOM 5.5 小结 第6章 SAX 1.0: XML简易API 6.1 事件驱动接口 6.2 SAX的由来 6.3 SAX的高级特性 6.3.1 可选择的源输入 6.3.2 处理外部实体 6.3.3 选择解析器 6.4 一些SAX设计模式 6.5 SAX 2.0 6.5.1 可配置的接口 6.5.2 核心的特性和属性 6.6 小结 第7章 命名空间和模式 7.1 混合词汇表 7.1.1 分解问题 7.1.2 重用 7.1.3 二义性与名称冲突 7.2 命名空间 7.3 定义和声明命名空间 7.3.1 声明一个命名空间 7.3.2 限定名 7.3.3 范围 7.4 在格式正规的书籍里使用命名空间 实例 7.5 模式 7.5.1 与DTD有关的问题 7.5.2 一个对创建模式的帮助 7.6 W3C在XML 模式方面的工作 7.6.1 DTD与XML 模式的比较 7.6.2 结构 7.6.3 数据类型 7.7 简化了的XML Data 7.7.1 MSXML对命名空间和模式的支持 7.7.2 数据类型 7.8 图书目录中的变化 7.8.1 为什么烦恼 7.8.2 重铸DTD 7.8.3 模式协调 7.9 小结 第8章 链接和查询 8.1 XML 信息集合 8.1.1 信息类型 8.1.2 信息集合的重要性 8.1.3 小结 8.2 链接 8.2.1 什么是链接? 8.2.2 W3C规范:XLink 8.3 Xpointer 8.3.1 HTML指针 8.3.2 Xpointer 规范 8.4 W3C Xpath推荐标准 8.4.1 Location Step 8.4.2 XPointer对XPath的扩展 8.4.3 Xpointer错误 8.4.4 小结 8.5 XML片段交换 8.5.1 什么是文档片段 8.5.2 文档片段的一些用途 8.5.3 问题:Bare文档片段并不总 是充分的 8.5.4 解决办法:环境信息 8.5.5 回顾实例 8.5.6 如何传输片段 8.5.7 小结 8.6 查询 8.6.1 什么是查询语言 8.6.2 关系型数据库和XML文档之间的区别 8.6.3 XML查询语言的发展历史 8.6.4 使用Xpath和XSLT查询XML文档 8.6.5 查询语言展望 8.7 小结 第9章 转换 XML 9.1 为什么转换 XML 9.1.1 在不同词汇表之间转换 9.1.2 动态转换 9.1.3 不同的浏览器 9.2 XSL 9.3 XSLT 样式表结构 9.3.1 创建模板 9.3.2 处理空白 9.3.3 输出格式 9.3.4 合并样式表 9.3.5 嵌入样式表 9.4 使用XSLT的例子 9.4.1 结构的转换 9.4.2 循环 9.4.3 排序 9.4.4 条件处理 9.4.5 名称模板 9.4.6 编号方式 9.4.7 拷贝 9.5 使用DOM进行XML文档的转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值