XML的DTD约束和Schema约束以及DOM4J整合Xpath解析XML

  • A+
所属分类:HTML5 XML JavaWeb

内容

* XML
    1.概述
    2.xml基本语法
    3.xml约束和解析(重点)
        在程序运行过程中,读取xml文档的数据---》解析
    4.工厂模式--- 预习spring思想(拓展)
        半成品软件,需要在此基础之上进行软件开发,提高效率
        反射+动态代理+xml文档===框架

一 XML

1.1 概述

可扩展标记语言(EXtensible Markup Language),都是由W3C组织提供和维护

可扩展:标签可以自定义 <user></user> <student></student>

作用(功能)

* 存储数据
    1.作为配置文件(框架使用它)【重点】
    2.作为数据的载体,在网络中传输

XML的DTD约束和Schema约束以及DOM4J整合Xpath解析XML

XML与HTML区别

1. xml文档语法严格,html文档语言松散
2. xml文档自定义,html文档是预定义
3. xml文档存储数据,html文档展示数据

1.2 快速入门

需求:编写一个user存储信息

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user id="1">
        <name>zhangsan</name>
        <age>18</age>
    </user>
    
    <user id="2">
        <name>lisi</name>
        <age>18</age>
    </user>
</users>

书写规范

1. 页面必须有有文档声明(必须在第一行)
2. 有且仅有一个根标签
3. 标签要正确嵌套和正确的结束
4. 标签的属性必须使用引号(单双都可)

1.3 XML组成

1. 文档声明
    格式:
        <?xml version="版本号" encoding="字符集"?>
    属性:
        version="1.0"  必须属性 指定xml文档的版本号 1.0(使用) or 1.1
        encoding="utf-8" 可选属性,默认根据你开发环境
    说明:
        必须在xml文档第一行
2. 标签(元素)
    双标签:
        <开始></结束>
    单标签:
        <开始/>
    说明:
        标签命名规则与java变量是一致,建议不要使用 xml   XML
3. 属性
    属性的定义与html属性是一致
        <user 属性="属性值" 属性='属性值'></user>
    特殊:
        id属性具有唯一性
4. 文本
    实体字符(转义字符)
        > 大于
        < 小于
        & &
    
    CDATA区:将数据原样展示输出  (了解)
        CDATA= character + data
        格式:
            <![CDATA[需要展示的内容]]>
5. 注释
    <!-- 注释内容 -->

1.4 XML约束

1)概述

作用:规定xml文档的书写规则

XML的DTD约束和Schema约束以及DOM4J整合Xpath解析XML

学习要求

1. 能够在xml中引入约束文档
2. 能够简单的读懂约束文档 IDE开发者工具,已经实现自动提示)

约束分类

1. DTD:一种简单的约束技术
    mybatis
2. Schema:一种复杂的约束技术
    spring

2)DTD约束

  • 当xml文档引入了DTD约束之后,它将xml文档从可扩展标记语言变成了==预定义标记语言==,也就是说限制了xml文档出现的标签和属性的等,以及标签和属性出现的次数和顺序等

DTD约束引入方式

1. 内部DTD约束
        <!DOCTYPE 根元素 [DTD约束内容]>
2. 外部DTD约束
    * 本地
            <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    * 互联网(推荐)
            <!DOCTYPE 根元素 PUBLIC "DTD文件名称" "DTD文件网络路径">

DTD约束语法(了解)

1. 标签(元素)
    * 嵌套标签
            格式:<!ELEMENT 标签名 (子标签..量词)
            量词:
                +   一次或多次
                *   零次或多次
                ?   零次或一次
                ,   按顺序出现
                |   选择其中一个
    * 普通标签
            格式:<!ELEMENT 标签名 标签类型>
            标签类型:
                (#PCDATA)   字符串
                EMPTY   单标签,例如:<hr/>
                ANY 任意类型
2. 属性
        格式:
            <!ATTLIST 标签名
                属性名 属性类型 属性说明
                属性名 属性类型 属性说明
                ...
                >
        属性类型:
            ID 唯一,必须以字母开头
            CDATA 字符串
            ENUM 枚举,例如:职务(班长|学习委员|学员) '学员'
        属性说明:
            #REQUIRED 必须项
            #IMPLIED 可选项
            #FIXED 固定值,例如:学校 CDATA #FIXED '程序员'

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
    <student number="heima_001" 职务="学习委员" 学校="程序员">
        <name>张三</name>
        <age>18</age>
        <sex></sex>
    </student>

    <student number="heima_002">
        <name>李四</name>
        <age>20</age>
        <sex></sex>
    </student>
</students>

<!--
    DTD教学实例文档.将注释中的以下内容复制到要编写的xml的声明下面
    复制内容如下:
    <!DOCTYPE students SYSTEM "student.dtd">
 -->

<!--
    限定标签 ELEMENT
        1)嵌套标签
            格式:<!ELEMENT 标签名 (子标签 量词) >
            量词:
                + 一次或多次
                * 零次或多次
                ? 零次或一次
                , 按照顺序出现
                | 任选其一
        2)普通标签
            格式:<!ELEMENT 标签名 标签类型>
            标签类型:
                (#PCDATA) 字符串
                EMPTY 空标签(单标签)  <br/>
                ANY 表示任意标签
-->
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--
    限定属性 ATTLIST attribute list
        格式:
            <!ATTLIST 标签名
                属性名 属性类型 属性说明
                属性名 属性类型 属性说明
                ... >
          属性类型:
                ID:唯一,要求属性值必须以字母开头
                CDATA: 字符串
                ENUM 枚举:
                    例如: 职务(班长|学习委员|学员) '学员'
          属性说明:
                #REQUIRED: 必选项
                #IMPLIED: 可选项
                # FIXED: 固定值
                    例如: 学校 CDATA #FIXED "程序员"
-->
<!ATTLIST student
        number CDATA #IMPLIED
        职务(班长|学习委员|学员) "学员"
        学校 CDATA #FIXED "程序员"
        >

3)Schema约束

  • Schema约束是一个特殊格式的xml文档,扩展名为*.xsd,xml文档可以==引入多个schema约束==,并且还可以限制元素内容的==数据类型、数据范围 1-150==

Schema约束引入方式

 <students xmlns="http://www.gyhqq.com/xml"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.gyhqq.com/xml  student.xsd"
           >     
 </students>
 
 1. xmlns = xml namespace --》xml命名空间
 2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        固定值,声明当前文档是一个被Schema约束的一个实例
 3. xsi:schemaLocation="http://www.gyhqq.com/xml  student.xsd"
        通过实例,引入约束文件路径
        格式:约束名 约束路径
 4. xmlns="http://www.gyhqq.com/xml"
        当前xml使用缺省(默认)的Schema约束,使用此约束中的元素直接写元素名即可
        例如:<student></student>
 5. xmlns:aa="http://java.sun.com"
        当前xml使用别名为 aa 的Schema约束,使用此约束中的元素需要加上别名
        例如:<aa:student></aa:student>

二 XML解析

2.1 概述

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

解析xml的方式

1. DOM:将xml文档内容一次性加载到内存,在内存中形成一颗DOM
        优点:操作方便,可以对文档进行CRUD的所有操作
        缺点:占内存
2. SAX:逐行扫描文档,一边扫描一边解析
        优点:不占内存
        缺点:只能读取,不能增删改
XML的DTD约束和Schema约束以及DOM4J整合Xpath解析XML
XML的DTD约束和Schema约束以及DOM4J整合Xpath解析XML

常用xml解析器

技术描述
JAXPSUN公司官方解析技术,支持DOM解析和SAX解析
PULLAndroid操作系统内置的解析器,sax方式的
JSOUP是一款Java的HTML解析器(后面爬虫课程中讲解)
JDOM开源的DOM方式解析技术
DOM4JJDOM增强版,也是开源的DOM方式解析技术(强烈推荐)

2.2 DOM4J解析XML

  • XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。

需求

通过dom4j技术来解析users.xml

如果解析的内容包含schema约束,比较麻烦

步骤分析

1. 导入jar
        dom4j-1.6.1.jar
2.  users.xml 复制到 src根目录下
3. 定义一个类 ParseDemo
        // 1.手动加载配置文件,通过类加载器
        // 2.创建DOM4J解析器的核心对象 SAXReader()
        // 3.获取document文档对象

常用api方法

1. 提供获取xml文档根标签(元素)
        *Element getRootElement();
2. Element对象提供方法
    2.1 获取标签名的方法
        String getName();
    2.2 获取所有的子标签信息
        List<Element> elements();
    2.3 获取指定标签名的属性对象
        Attribute attribute(String 属性名);
    2.4 获取指定名称的子标签
        Element element(String 标签名);
    ------------------------------------------------
    2.5 直接获取指定名称的属性值
        String attributeValue(String 属性名);
    2.6 直接获取指定名称子标签文本内容
        String elementText(String 标签名);

public static void main(String[] args) throws Exception {
    // 1. 手动加载配置文件
    // 1.1 获取类加载器对象
    ClassLoader classLoader = ParseDemo.class.getClassLoader();
    // 1.2 读取users.xml 获取该文件io流
    InputStream is = classLoader.getResourceAsStream("users.xml");
    // 2. 创建DOM4J核心解析器对象  simple  api   xml
    SAXReader saxReader = new SAXReader();
    // 2.1 加载 io流
    Document document = saxReader.read(is);
    // 3.1 获取文档的根标签(元素)
    Element rootElement = document.getRootElement();
    System.out.println(rootElement);
    // 3.2 获取根标签名  <users>
    String name = rootElement.getName();
    System.out.println(name);
    // 3.3 获取users下所有的子标签榆树
    List<Element> elements = rootElement.elements();
    System.out.println("users子标签长度:" + elements.size());
    // 3.4 获取第二个标签
    Element element = elements.get(1);
    // 3.5 获取 第二个标签 id属性对象
    Attribute idAttribute = element.attribute("id");
    System.out.println(idAttribute.getValue());
    // 3.6 获取name子标签
    Element nameElement = element.element("name");
    System.out.println(nameElement.getText());
    // -----------------------
    // 3.7 直接 user标签 edu属性值
    System.out.println(element.attributeValue("edu"));
    // 3.8 直接获取 user标签 子标签的 age文本内容
    System.out.println(element.elementText("age"));
}

2.2 DOM4J整合Xpath解析XML

  • 使用Xpath表达式可以快速查找文档中的标签

Xpath表达式

  • 资料中提供了xpath学习API文档
* /aaa/bbb 绝对路径
* //bbb 任意路径
----------------------------------
* //ccc[@id="xxx"] 根据标签id属性快速查找
    document.getElementById("")

DOM4J提供了解析XPath表达式方法

1. 获取一个节点(元素)
        Node selectSingleNode(String xpath表达式);
2. 获取一组节点(元素)
        List<Node> selectNodes(String xpath表达式);

注意:还需要导入xpath依赖包 jaxen.jar

public static void main(String[] args) throws Exception {
    // 1. 手动加载配置文件
    // 1.1 获取类加载器对象
    ClassLoader classLoader = XpathDemo.class.getClassLoader();
    // 1.2 读取users.xml 获取该文件io流
    InputStream is = classLoader.getResourceAsStream("users.xml");
    // 2. 创建DOM4J核心解析器对象  simple  api   xml
    SAXReader saxReader = new SAXReader();
    // 2.1 加载 io流
    Document document = saxReader.read(is);
    // 3.1 通过xpath表达式 获取 指定id属性值的 唯一节点
    Node node = document.selectSingleNode("//f[@id='f_01']");
    // 将 node节点 强转为 element元素
    Element element = (Element) node;
    System.out.println(element.getText());
}
  • 资源分享QQ群
  • weinxin
  • 官方微信公众号
  • weinxin
沙海
TripodCloud:性价比最高的CN2 GIA服务器
C语言项目源码分享
动力节点最牛Java自学基础教程
网站https安全证书安装,伪静态配置

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: