XML

XML

1.1 XML概述

XML(Extensible Markup Language): 可拓展标记语言

  • 可拓展: xml标签都是自定义的.
  • xml与html的异同:
    • 他们两个的亲爹都是w3c(万维网联盟, World Wide Web Consortium),早期的时候只有html,xml是后面出来的
    • 本来是和html竞争的(xml开始用于展示数据),但是打不过,所以现在和配置文件properties竞争(存储数据)
    • xml功能: 用标签来存储数据
      • 作为配置文件来使用
      • 数据文件可以在网络中传输

1.2 XML快速入门

基本语法

  1. xml文档的后缀名是.xml

  2. xml的第一行必须是文档声明(注意,就是声明前面不能加任何东西,一个空格也不行)

  3. xml文档中有且仅有一个根标签

  4. 属性值必须使用引号引起来 `

    <user id="1"> user>
    
  5. 标签一定要成对,除非是自闭合标签

  6. xml的标签区分大小写

快速入门




<users>

    <user id="1">
        <name>张三name>
        <age>22age>
        <gender>malegender>
    user>

    <user id="2">
        <name>李四name>
        <age>25age>
        <gender>malegender>
    user>

users>

组成部分

  1. 文档声明

    1. 格式:
    2. 文档声明的属性列表:
      1. version: 版本号 (一个必须的属性) (虽然已经发布了1.1,但是由于他不向下兼容,我们一般使用1.0版本)
      2. encoding: 编码方式 (告知解析引擎当前文档使用了什么字符集,默认是: ISO-8859-1)
      3. standalone: 是否独立 (两个属性值,yes或no),标识这个文件的内容是否依赖于其他文件
  2. 指令(结合css): 来控制css的样式

  3. 标签

    1. 标签名称都是自定义的,但是有一定的规则
      1. 名称可以包含字母,数字以及其他字符
      2. 不能数字或标点符号开头
      3. 名称不能以字母xml开始
      4. 名称不能包含空格
  4. 属性

    1. id属性唯一
  5. 文本内容

    1. 可以嵌套标签

    2. 内容里面不可以写< , && , > 等特殊符号,应该用转义字符表示

    3. CDATA区: 里面的内容不会被解析,会被原封不动的展示

      
      //编辑器里面直接输CD就会出现提示
      

1.3 约束

1.3.1 概述

xml可以随意地写自定义标签,但是我们在写框架的配置文件的时候,不能够自己随便写,要根据说明文档来编写这个配置文件,这个说明文档就叫做约束

说明文档: 规定xml文档的书写规则

我们作为框架的使用者(程序员)

  1. 能够在xml中引入约束文档
  2. 能够简单的读懂约束文档

1.3.2 约束技术: DTD

他是一种简单的约束技术

下面有一个约束文件,我们来阅读一下

XML_第1张图片

  1. 第一行代表可以有名叫students的标签,他的子标签是student,子标签可以出现无数次
  2. 第二行表示 student可以分别有name,age,sex三个标签,没有写量词,那么表示只能出现一次
  3. 三四五行表示这三个标签没有子标签,同时他们里面的内容表示字符串
  4. 最后一行,表示 student标签里面可以有number这个属性,同时加上了id这个特性,就是number不能重复

实现步骤

  1. 引入dtd文件到xml文文档中
    1. 内部dtd: 将约束规则定义在xml文档中
    2. 外部dtd: 将约束的规则定义在外部的文件中
      1. 本地的:
      2. 网络的:


<students>
    <student number="s001" >
        <name>张三name>
        <age>23age>
        <sex>malesex>
    student>
    <student number="s002" >
        <name>张三name>
        <age>23age>
        <sex>malesex>
    student>
students>

他的缺陷: dtd规定不了标签里面具体的内容,例如: 我不能规定age标签里面的岁数不能超过110

1.3.3 约束技术: Schema

他是一种复杂的约束技术

**他的文件后缀名是.xsd **

我们其实会发现xsd文档里面就是xml格式的

XML_第2张图片

和上面的例子内容大体一致,读一读就理解了

引入

XML_第3张图片

  1. 第一步和第二步都是固定写法,没什么好说的
  2. 第三步有点搞头, 字符串的左边是写我们自定义的命名空间的名字, 字符串的右边写的是我们引入的xsd文档的位置, 其实可以理解为,前者是后者的别名
  3. 第四步存在的意义就是,如果我们没有这句话,那么我们就要在每一个标签上面1写一个前缀来声明约束,但是有了这句话,在根标签上面引入这个命名空间,那么我们后面写的每一个标签都会默认加上这个约束

1.4 解析

1.4.1 解析概述

操作xml文档

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

解析xml的方式

  1. DOM: 将标记语言文档一次性加载进内存 ,在内存中形成一棵dom树
    1. 优点: 操作方便, 可以对文档进行CRUD的所有操作
    2. 缺点: 占内存,因为解析出来的dom是比原来的xml大很多的
  2. SAX: 逐行读取, 基于事件驱动的
    1. 优点: 不占内存,现在的手机一般用的就是sax思想进行解析
    2. 缺点: 只能读取,不能CRUD

因为我们是做服务器端开发的,所以我们这里用dom的思想进行开发

xml的解析器

  1. JAXP: sun公司提供的解析器,支持dom和sax思想 (不好用,垃圾软件)
  2. DOM4J: 一款非常优秀的解析器
  3. Jsoup: jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。因为它特别的好用,我们用它来解析xml
  4. PULL: AndroidOS自带的解析器,sax方式的

1.4.2 Jsoup快速入门

步骤

  1. 导入jar包
  2. 获取Document对象
  3. 获取对应的标签Element对象
  4. 获取数据
package demo16;

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

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

public class demo {
     
    public static void main(String[] args) throws IOException {
     
//        2 获取document对象,根据xml文档获取
//        2.1 获取student.xml的path
        String path = demo.class.getClassLoader().getResource("student.xml").getPath();
//        2.2 解析xml文档,加载文档进内存,获取dom树
        Document document = Jsoup.parse(new File(path), "utf-8");
//        3 获取元素对象
        Elements name = document.getElementsByTag("name");
        System.out.println(name);
        //
        // 张三
        //
        //
        // 张三
        //
    }
}

//下面这个是xml文件
<?xml version='1.0' ?>
<students>
    <student number="s001" >
        <name>张三</name>
        <age>23</age>
        <sex>male</sex>
    </student>
    <student number="s002" >
        <name>张三</name>
        <age>23</age>
        <sex>male</sex>
    </student>
</students>

1.4.3 Jsoup的对象

  1. Jsoup: 工具类,里面的方法可以解析html或xml文档,返回Document

    1. Parse(): 解析xml,返回Document对象

      static Document	parse​(File in, String charsetName)	
      将文件的内容解析为 HTML。
          
      static Document	parse​(File in, String charsetName, String baseUri)	
      将文件的内容解析为 HTML。
          
      static Document	parse​(InputStream in, String charsetName, String baseUri)
      阅读输入流,并将其解析为文档。
          
      static Document	parse​(InputStream in, String charsetName, String baseUri, Parser parser)	
      阅读输入流,并将其解析为文档。
          
      static Document	parse​(String html)	
      将HTML或XML解析为文档。
          
      static Document	parse​(String html, String baseUri)	
      将HTML解析为文档。
          
      static Document	parse​(String html, String baseUri, Parser parser)	
      使用所提供的帕瑟将HTML解析到文档中。
          
      static Document	parse​(URL url, int timeoutMillis)	
      获取一个URL,并将其解析为HTML。
          URL url = new URL(String 网址);
      
  2. Document: 文档对象,代表内存中的Dom树 (他是Elements的子类,它可以使用他的父类的所有方法)

    1. toString(),这个方法就是将你整个文档的内容打印下来

    2. Elements	getElementsByTag​(String tagName)	
      查找包含并递归于此元素下的元素,以及指定的标签名称。
          
      Elements	getAllElements()	
      在此元素下查找所有元素(包括自我和儿童儿童)。
          
      Element	getElementById​(String id)	
      通过 ID 查找元素,包括或在此元素下查找元素。
          
      Elements	getElementsByAttribute​(String key)	
      查找具有命名属性集的元素。
          
      Elements	getElementsByAttributeStarting​(String keyPrefix)	
      查找从所提供的前缀开始具有属性名称的元素。
          
      Elements	getElementsByAttributeValue​(String key, String value)	
      查找具有特定值属性的元素。
      
  3. Elements: 元素对象的集合。 可以当作ArrayList来使用

  4. Element: 元素对象,里面的方法可以获取元素的属性以及内容等等 (上面的方法和js中的dom的方法有很强的耦合性)

    1. 获取元素对象: 上面Document对象那里讲了

    2. 获取属性值:

      1. String attr(String 属性名称):继承自Node类 (属性名不区分大小写)
    3. 获取文本内容:

      1. String text(): 获取子标签以及标签的内容(没有标签在里面)

        1. Elements name = document.getElementsByTag("students");
          String text = name.text();
          System.out.println(text);
          //张三 23 male 张三 23 male
          
      2. String html(): 包括标签在内,获取他的标签及其子标签的所有内容

        1.  Elements name = document.getElementsByTag("students");
                  String text = name.html();
                  System.out.println(text);
                  // 
                  // 
                  //  张三
                  //  
                  // 
                  //  23
                  //  
                  // 
                  //  male
                  //  
                  // 
                  // 
                  // 
                  //  张三
                  //  
                  // 
                  //  23
                  //  
                  // 
                  //  male
                  //  
                  //
          
  5. Node: 结点对象 (对于我们来说不常用,了解即可)

快捷的查询方式

  1. selector: 选择器 , 可以结合css的选择器来实现快捷的查询 (用法和css很像,总之爽就完了)

    1. //这个方法在Elements对象中使用,当然,document也可以
      
      Elements	select​(String cssquery)	
      在此元素列表中查找匹配元素。
      
    2. 选择器的语法

    3. XML_第4张图片

    4. public class demo {
               
          public static void main(String[] args) throws IOException {
               
              String path = demo.class.getClassLoader().getResource("student.xml").getPath();
              Document document = Jsoup.parse(new File(path), "utf-8");
              Elements name = document.getElementsByTag("students");
      
              //查询name标签
      //        Elements name1 = name.select("name");
      //        System.out.println(name1);
      
              //查询有number属性的标签,且值为s001,并且返回里面的内容
      //        String text = name.select("[number=s001]").text();
      //        System.out.println(text);
          }
      }
      
  2. Xpath: 是W3C提供的快速查询xml标签的一种方法 ,XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

    1. 使用jsoup的xpath需要额外的jar包

XML_第5张图片

XML_第6张图片

你可能感兴趣的:(xml,Java,笔记,xml,java,编程语言)