XML语言

16.XML

1.概念

XML:Extendsible Markup Language 可扩展标记语言

1.可扩展:

标签都是自定义的

2.功能:

1.配置文件

2.在网络中传输

3.与HTMl的区别

1.XML标签是自定义的,HTML标签是预定义的

2.XML语法严格,HTML语法松散

3.XML是存储数据的,HTML是展示数据的

2.语法

1.语法:

1.XML文档的后缀:.xml

2.XML文档的第一行必须是文档声明<?XML version='1.0' ?>

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

4.属性值必须使用引号(单双均可)引起来

5.标签必须正确关闭

6.XML标签区分大小写

案例:

<?xml version="1.0" encoding="UTF-8" ?>
<users>
     <user id="1">
          <name>比尔盖茨</name>
           <age>29</age>
          <gender>Male</gender>
     </user>
    <user  id="2">
        <name>埃隆马斯克</name>
        <age>64</age>
        <gender>Male</gender>
    </user>
</users>

2.组成

1.文档声明
  • 格式:<?xml 属性列表 ?>

  • 属性列表:

    1.  version:版本号

    2. encoding:编码格式。告知解析引擎当前文档使用的字符集,默认值为:ISO-8859-1.用来校验文本 实际编码是否与告知编码集相符

    3. Standalone:是否独立

      取值:

      ​ yes: 不依赖其他文件

      ​ no:依赖其他文件

2.指令:

​ 与css结合使用控制XML样式的,现在已经不用了

3.标签:

​ 自定义标签

规则:

​ 1.名称可以包含字母,数字以及其它字符

​ 2.名称不能以数字或者标点符号开始

​ 3.名称不能以 字母组合XML(任何大小写组合都不行,XML,Xml等)开始

​ 4.名称不能包含空格

4.属性

规则:

​ 1.以键值对的形式存在

​ 2.属性必须用引号引起来

​ 3.id属性值必须唯一

5.文本

注意:

​ 1.文本中包含<,>,&必须使用转译字符:

  • <:&lt;
  • &:&amp;
  • >&gt;

​ 2.原样输出:CDATA区

  • 格式:<![CDATA[内容]]>

3.约束

3.1概述

​ 规定xml文档的书写规范

学习要求

​ 1.会引入约束

​ 2.大致能读懂约束

约束图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uGMUzQOi-1614243255072)(E:\JAVA上课笔记\img\image-20210225131038125.png)]

分类

  • DTD:简单的约束技术

  • Schema:复杂的约束技术

3.2DTD

  • 引入

​ 内部DTD:将约束规则定义在XML文档中(写完外部在写内部即可)

1.外部DTD

studen.dtd

<!--students标签 它内部可以包含0-n个student标签-->
<!ELEMENT students (student*) >
<!--student标签 它内部包含name,age,sex三个标签,顺序必须按照规定顺序,并且只能出现一次-->
<!ELEMENT student (name,age,sex)>
<!--name,age,sex标签,#PCDATA代表String数据类型-->
 <!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--定义属性:student标签中,number:属性名 ID:唯一#required必须的-->
<!ATTLIST student number ID #REQUIRED>

student.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
    <student number="s001">
        <name>刘德华</name>
        <age>哈哈</age>
        <sex></sex>
    </student>
    <student number="s002">
        <name>刘德华</name>
        <age>28</age>
        <sex></sex>
    </student>
</students>

2.内部DTD

<?xml version="1.0" encoding="UTF-8" ?>
<!--<!DOCTYPE students SYSTEM "student.dtd">-->
<!DOCTYPE students [
        <!--students标签 它内部可以包含0-n个student标签-->
        <!ELEMENT students (student*) >
        <!--student标签 它内部包含name,age,sex三个标签,顺序必须按照规定顺序,并且只能出现一次-->
        <!ELEMENT student (name,age,sex)>
        <!--name,age,sex标签,#PCDATA代表String数据类型-->
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        <!ELEMENT sex (#PCDATA)>
        <!--定义属性:student标签中,number:属性名 ID:唯一#required必须的-->
        <!ATTLIST student number ID #REQUIRED>]>
<students>
    <student number="s001">
        <name>刘德华</name>
        <age>28</age>
        <sex></sex>
    </student>
    <student number="s002">
        <name>刘德华</name>
        <age>28</age>
        <sex></sex>
    </student>
</students>

通过上述案例,我们不难发现DTD的弊端:无法对属性内容进行限定

外部DTD

  • 本地的:<!DOCTYPE 根标签 SYSTEM "DTD文件位置">
  • 网络的:<!DOCTYPE 根标签 PUBLIC "DTD文件名" "DTD文件位置(URL)">

内部DTD

<!DOCTYPE 根标签 [外部DTD]>

3.3Schema

Schema文档要求能读懂,可以做简单的修改即可

Student.xsd

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.wdit.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.wdit.cn/xml" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/>
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="IT_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wc1B6ahK-1614243255073)(E:\JAVA上课笔记\img\image-20210225153303960.png)]

Student.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!--
       1.根元素
       2.固定格式:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       3.引入xsd文件命名空间; xsi:schemaLocation="http://www.wdzl.cn/xml student.xsd"
       *http://www.wdzl.cn/xml:命名空间
       *student.xsd:约束文件存储路径
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.wdit.cn/xml student.xsd"
          xmlns="http://www.wdit.cn/xml">
    <student number="IT_0001">
        <name>周杰伦</name>
        <age>18</age>
        <sex>male</sex>
    </student>
</students>

4.解析

4.1常见XML操作

1.解析:将XML文档中数据读到内存中

2.持久化:将内存中数据保存到XML文档中(不常用)

4.2解析XML方式

1**.DOM**:将标记语言文档一次性加载到内存,在内存中形成一个DOM树

优点:操作简单,可以对文档进行CRUD(增删改查)

缺点:占内存,不适合移动和嵌入式设备

2.SAX(Simple API for XML):逐行读取基于事件驱动的解析方式

3.第三方解析

  • jdom:在dom基础上进行了封装
  • dom4j:在jdom基础上进行了封装
  • pull:主要用在Android手机开发,它与SAX解析方式类似,都是事件驱动方式解析XML文件

5.dom4j解析技术-重点

5.1dom4j类库的使用

由于dom4j它不是sun公司的技术,而属于第三方公司的技术,需要配置依赖jar包。

5.2dom4j 解析案例

1.准备xml解析用例

<?xml version="1.0" encoding="UTF-8" ?>
<books>
    <book bid="BID123456">
        <name>Java葵花宝典</name>
        <price>20.59</price>
        <author>詹姆斯高斯林</author>
    </book>
    <book bid="BID123444">
        <name>Java入门宝典</name>
        <price>29.9</price>
        <author>比尔盖茨</author>
    </book>

</books>

2.准备对应的Book类

package org.wdit.xml.dome4jtest;

public class Book {
    private  String bid;
    private  String name;
    private  String price;
    private  String author;
    public Book(){

    }

    public Book(String bid, String name, String price, String author) {
        this.bid = bid;
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getBid() {
        return bid;
    }

    public void setBid(String bid) {
        this.bid = bid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bid='" + bid + '\'' +
                ", name='" + name + '\'' +
                ", price='" + price + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

3.新建jar包,并将jar添加到项目中

4.使用dom4j读取XML文件

5.通过Document对象获取xml数据,并包装成实体类

package org.wdit.xml.dome4jtest;


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;

import java.util.List;

public class dom4jtest {
    @Test
    public  void test() throws DocumentException {
        //将XML文件包装成Document对象
        SAXReader saxReader=new SAXReader();
        Document document = saxReader.read("books.xml");
        System.out.println(document);

    }
    @Test
    public void test2() throws DocumentException {
        SAXReader saxReader=new SAXReader();
        Document document = saxReader.read("books.xml");
        //2.通过Document对象获取根元素
        Element rootElement = document.getRootElement();
      //3.获取根元素的子元素集合
        List<Element> books = rootElement.elements("book");
        //4.遍历,处理每一个标签,并将数据包装成book类对象
       for(Element book:books){
         //书名
           Element nameElement = book.element("name");
           String name = nameElement.getText();
          // System.out.println(name);

         //价格
           Element priceElement = book.element("price");
           String price = priceElement.getText();

           //作者
           String author = book.element("author").getText();

           //属性
           String bid = book.attributeValue("bid");

           //包装对象
           System.out.println(new Book(bid,name,price,author));
       }




    }
}
 String name = nameElement.getText();
          // System.out.println(name);

         //价格
           Element priceElement = book.element("price");
           String price = priceElement.getText();

           //作者
           String author = book.element("author").getText();

           //属性
           String bid = book.attributeValue("bid");

           //包装对象
           System.out.println(new Book(bid,name,price,author));
       }




    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值