2020年XML课堂笔记

XML

1. XML简介

概念:可扩展标记语言

  • 可扩展:标签都是程序员自定义

功能:存储数据,作为配置文件,在网络中传输数据

注意:properties文件只能存储小配置文件

xml与html区别

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

基本语法

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

2. XML组成部分

  1. 文档声明

    1. 格式:<?xml 属性列表?>
    2. 属性列表:
      • version:版本号(必须),一般1.0
      • encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值ISO-8859-1
      • standalone:是否依赖其他文件 yes或no
  2. 标签:名称自定义

    • 规则:
      1. 名称可以包含字母、数字、其他字符
      2. 名称不能以数字或者标点符号开始
      3. 名称不能以xml开头
      4. 名称不能包含空格
  3. 属性:id属性唯一

  4. 文本:

    • CDATA区:原样展示数据或代码
    • 格式:<![CDATA[数据]]>

3.XML约束

约束:规定xml文档的书写规则

约束技术分类:

  1. DTD:一种简单的约束技术
  2. Schema:一种复杂的约束技术,比DTD严格得多

DTD

后缀名:.dtd

使用步骤:

  1. 引入dtd文档到xml文档中
    • 内部dtd:将约束规则定义在xml文档中
    • 外部dtd:将约束规则定义在外部的dtd文件中
      • 本地引入:<!DOCTYPE xml根标签名称 SYSTEM "dtd文件路径">
      • 网络引入:<!DOCTYPE xml根标签名称 PUBLIC "dtd文件名" "dtd文件网络路径URL">

Schema

后缀名:.xsd

使用步骤:

  1. 引入xsd文档
    1. 填写xml文档的根标签
    2. 引入xsi前缀。(固定格式)xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. 引入xsd文件命名空间。xsi:SchemaLocation="文件路径 xsd文件名"
    4. 为每一个xsd文档声明前缀。xmlns:起名="文件路径"

4. 解析XML文档

解析:操作xml文档,将文档中的数据读取到内存中

  1. 操作xml文档

    1. 解析(读取):将文档中的数据读取到内存中
    2. 写入:将内存中的数据保存到xml文档。持久化存储
  2. 解析xml文档的方式

    1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树(一般用于服务端)
      • 优点:操作方便,可以对文档进行CRUD的所有操作
      • 缺点:占内存
    2. SAX:逐行读取,读取一行释放一行(一般用于移动端)
      • 优点:不占内存
      • 缺点:只能读取,不能CRUD
  3. xml的解析器:

    1. jsoup(DOM思想):

      1. 使用步骤:

        1. 导入jar包jsoup-1.11.2.jar

          注意:文件路径不能带空格

        2. 获取Document对象

        3. 获取对应的标签Element对象

        4. 获取数据

xml实例代码

<?xml version="1.0"  encoding="UTF-8"?>
<students>
    <student number="AFan_0001">
        <name id="tom">tom</name>
        <age>32</age>
        <sex>male</sex>
    </student>

    <student number="AFan_0002">
        <name id="jack">jack</name>
        <age>12</age>
        <sex>female</sex>
    </student>

    <student number="AFan_0003">
        <name id="afan">afan</name>
        <age>20</age>
        <sex>male</sex>
    </student>

</students>

jsoup实例代码

package Afan;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

//Jsoup解析XML文档
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //1. 获取xml文档的路径
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2. 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //3. 获取元素对象 Element
        Elements name = document.getElementsByTag("name");
        System.out.println("标签个数:"+name.size());
        System.out.println("标签元素:"+name.text());
    }
}

对象的使用

  1. Jsoup:工具类,可以解析或xml文档,返回Document对象

    • parse方法:解析html或xml文档,返回Document
      • parse(File in,String charsetName):根据字符集解析xml或html文档
      • parse(String html):解析xml或html文档字符串
      • parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml文档对象
  2. Document:文档对象。代表内存中的dom树

    • 获取Element对象

      • getElementById(String id):根据id属性值获取唯一的Element对象

      • getElementsByTag(String tagName):根据标签名称获取元素对象集合

      • getElementsByAttribute(String key):根据属性名称获取元素对象集合

      • getElementsByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合

  3. Elements:元素Element对象的集合。相当于ArrayList<Element>

  4. Element:元素对象

    1. 获取子元素对象

      • getElementById(String id):根据id属性值获取唯一的Element对象

      • getElementsByTag(String tagName):根据标签名称获取元素对象集合

      • getElementsByAttribute(String key):根据属性名称获取元素对象集合

      • getElementsByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合

    2. 获取属性值

      • String arrr(String key):根据属性名称获取属性值
    3. 获取文本内容

      • String text():获取文本内容
      • String html():获取标签体的所有内容(包括子标签的字符串内容)
  5. Node:节点对象(了解)

    • DocumentElement

实例代码

package Afan;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

//Jsoup解析XML文档
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //1. 获取xml文档的路径
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2. 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //根据标签名称name获取元素对象
        Elements name = document.getElementsByTag("name");
        System.out.println(name);
        
        System.out.println("--------------------------");
        //获取number属性的元素对象
        Elements number = document.getElementsByAttribute("number");
        System.out.println(number);

        System.out.println("--------------------------");
        //获取number=AFan_0002的元素对象
        Elements person = document.getElementsByAttributeValue("number", "AFan_0002");
        System.out.println(person);
    }
}

快捷查询方式

  1. selector:选择器

    • 使用方法:Elements select(String cssQuery)
      • 语法:cssQuery语法与CSS选择器语法类似
  2. XPath:XPath即为XML路径语言,用于确定XML文档的某一部分

    • 使用Jsoup的XPath需要导入jar包JsoupXpath-0.3.2.jar
    • 查询w3school参考手册,使用XPath的语法完成查询

XPath的常用表达式

表达式 描述
nodename 选取nodename元素的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
选取当前节点的父节点。
@ 选取属性。

XPath实例代码

package Afan;

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 java.io.File;
import java.io.IOException;
import java.util.List;

//Jsoup解析XML文档
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //1. 获取xml文档的路径
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2. 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "UTF-8");

        JXDocument jxDocument = new JXDocument(document);

        //查询所有student标签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //查询所有student标签下的name标签
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //查询student标签下的id属性为jack的name标签
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='jack']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章