JavaWeb笔记-06-schema入门 jaxp-sax解析

1、schema约束

schema基础:

    1)schema符合xml的语法,xml语句 
        dtd语法: <!Element 元素名称 约束>

    2)一个xml中可以有多个schema,
        多个schema使用名称空间区分(类似于java包名)

    3)schema里面可以支持更多的数据类型,并支持用户自定义新的数据类型
            dtd里面有PCDATA类型

这里写图片描述

这里写图片描述

2、schema快速入门

    创建一个schema文件  后缀名 .sxd
    xmlns="http://www.w3.org/2001/XMLSchema"  
            表示文件是 XMLSchema文件
    targetNamespace="http://www.example.org/1"  
            表示使用schema约束文件,通过此地址引入约束文件
    xmlns:tns="http://www.example.org/1" 
    elementFormDefault="qualified">

步骤:
    1)看xml中有多少个元素  有几个元素就写几个element
    2)看简单元素和复杂元素
        复杂元素:
            <element name="复杂元素">
                <complexType>    //声明为复杂类型
                    <sequence>   //有序的  复杂元素指示器,表示为有序的
                        子元素
                        子元素 
                        ...
                    </sequence>
                </complexType>
            </element>

        简单元素:写在复杂元素 <sequence>内部
            <complexType>
                <sequence>
                    <element name="子元素名称" type="子元素数据类型"></element>
                    <element name="子元素名称" type="子元素数据类型"></element> 
                      ...
                </sequence>
            </complexType>
    3)引入约束文件(在被约束文件里面)
        被引入文件根节点属性
        <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            --表示xsi是被约束文件
            解释:
            xmlns:xsi : 为xml文件起名为xsi,避免与下面的地址名重复。
            "http://www.w3.org/2001/XMLSchema-instance" :"约束文件-instance"

        xmlns="http://www.example.org/1"
            --地址引用于约束文档的targetNamespace 

        xsi:schemaLocation="http://www.example.org/1 1.xsd">
            解释:
            http://www.example.org/1 :约束文件地址
            1.xsd : 约束文件名       

    注:引入多个schema文件时,填写多个地址引入

        有多个schema文件时,标签前需声明schema文件地址名
            eg: <schema文件地址名: name> aaa </name>


知识点:
    1)复杂元素指示器
        1)all :表示只出现一次
        2)choice : 只出现其中的一个
        3)sequence :元素按照顺序出现
        4)maxOcurs="unbounded" : 表示出现次数无限制
        5)any : 任意元素

    2)属性约束:
        <attribute> </attribute>  写在复杂元素里面  <complexType>外面

        eg:<attribute name="id1" type="int" use="required"> </attribute> 
            name : 属性名称
            type :属性类型
            use : 属性必须出现。

3、sax解析原理

sax方式:事件驱动,边读边解析

SAXParser: 解析类  抽象类  通过 SAXParserFactory.newSAXParser()方法得到
    方法:
    parse(File f , DefaultHandler dh)  两个参数
            传参为:xml路径,事件处理器

SAXParserFactory: 解析工厂  抽象类  通过 .newInstance()方法得到工厂实例


sax解析过程
    解析到开始标签,执行startElement方法
    解析到文本内容,
    解析到结束标签,执行endElement方法

这里写图片描述

4、使用jaxp的sax方式实现查询

(1)打印出整个文档

        步骤: 
        1.创建解析器工厂
            //SAXParserFactory saxParseFactory = SAXParserFactory.newInstance();

        2.创建解析器
            //SAXParser saxParser = saxParseFactory.newSAXParser();

        3.执行parse方法  
            .parse(File f , DefaultHandler dh)
            //saxParser.parse("src\\p1.xml", new MyDefaul1());

            a.需要创建一个类,继承DefaultHandler类
            b.重写类中的三个方法
                startElement  重写方法打印出开始标签
                characters   重写方法打印出文本
                endElement   重写方法打印出结束标签

(2)实现获取所有name的值

        在(1)的基础上 分别重写三个方法

        boolean flag = false;

        startElement  //判断name值是否等于返回的标签值   
                if("name".equals(qName))
                    flag = true;
        characters    //当flag == true 打印值
            if(flag == true)
                System.out.println(new String(ch,start,length));

        endElement   // 执行到结束方法,把flag再次设为false
            if(flag == true)
                flag = false;

(3)获得第一个name的值

        在(2)的基础上 添加限制 

         添加 定义 idx = 0; 

         startElement  是name元素时 idx++;
         characters  当idx==1时,打印

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81211563