xml、schema、jaxp、dom、sax、dom4j等笔记+代码详解


1、表单提交方式
    * 1.使用submit提交
            <form>
                    ...
                    <input type="submit"/>
            </form>
    * 2.使用button提交
            - 代码
             <body>
                <form id="form1">
                    <input type="text" name="uesename"/><br>
                    <input type="button" value="提交"  onclick="form1();"/>
                </form>
             </body>

             <script type="text/javascript">
                    function form1(){
                        var form1=document.getElementById("form1");
                        form1.action="hello.html";
                        form1.submit();
                    }
             </script>
    * 3.使用超链接提交
            <a href="hello.html?username=123">使用超链接提交</a>

    * 事件:

        onclick:鼠标点击事件
        onchange:改变内容(一般和select一起使用)

        onfocus:得到焦点
        onblur:失去焦点

关于xml

1、xml简介
        * eXtensible Markup Language:可扩展标记型语言
                ** 标记型语言:html是标记型语言
                        - 也是使用标签来操作
                ** 可扩展:
                        - html里面的标签是固定,每个标签都有特定的含义
                        - 标签可以自己定义,可以写中文的标签
        * xml用途
                ** html是用于显示数据,xml也可以显示数据(不是主要功能)
                ** xml主要功能,为了存储数据

        * xml是w3c组织发布的技术

        * xml有两个版本 1.0 1.1
                - 使用的都是1.0版本

2、xml的应用
        1)不同的系统之间传输数据
        2)用来表示生活中有关系的数据
        3)经常用在文件配置

3、xml的语法
        1)xml的文档声明
                * 创建一个文件 .xml
                * <?xml version="1.0" encoding="gbk"?>
                ** 文档声明必须写在第一行第一列

                * 属性
                    - version:xml版本
                    - encoding:xml编码 gbk 中文简体 utf-8 中文  iso8859-1 不包含中文
                    - standalone:是否需要依赖其他文件 yes/no

        2)定义元素(标签)
        3)定义属性
        4)注释
        5)特殊字符
        6)CDATA区
        7)PI指令

4、xml的元素(标签)定义
        ** 标签定义有开始必须有结束
        ** 标签没有内容,可以在标签内结束 <aa/>
        ** 标签可以嵌套
        ** 一个xml中,只能有一个根标签,其它标签都是这个标签下面的子标签
        ** 在xml中,会把空格和换行都当成内容来解析
        ** xml标签可以是中文

        ** xml标签的命名规则
                1.xml代码区分大小写
                2.xml标签不能以数字和下划线开头
                3.xml标签不能以xml、XML、Xml等开头

5、xml的属性
        * html是标记型文档,可以有属性
        * xml也是标记型文档,也可以有属性

        *属性定义的要求
                1)一个标签上可以有多个属性
                2)属性名称不能相同
                3)属性名称和属性值之间用 = ,属性值用单引号或者双引号
                4)xml属性的名称规范与元素的名称规范一致

6、xml中的注释
        * <!--注释-->
        * 注释不能嵌套

7、xml中的特殊字符
        * 如果想要在xml中显示 a< b,就要用到转义
                 <      &lt;
                 >      &gt;

8、CDATA区(了解)
        * 可以解决多个字符都需要转义的操作
                if( a < b && b < c && d > f ){}
        * 把这些内容放到CDATA区里面,就不需要转义了
        * 写法:
                <![CDATA[ 内容 ]]>
            比如:
                <![CDATA[ <b> if( a < b && b < c && d > f ){} </b>]]>
        * 把特殊字符当做文本内容,而不是标签

9、PI指令(处理指令)(了解)

        * 可以在xml中设置样式
        * 写法
                <?xml-stylesheet type="text/css" href="css文件的路径"?>0:04

        * 设置样式,只能对英文标签名称起作用,对于中文的标签名称不起作用的

xml的约束

10、xml的约束
        1)dtd
            * 创建一个文件 后缀名为 .dtd
            * 步骤:
                1.看xml中有多少个元素,就在dtd文件中写几个<!ELEMENT>
                2.判断元素是简单元素还是复杂元素
                    - 复杂元素:有子元素的元素
                            <!ELEMENT 元素名称(子元素1,子元素2..)>
                    - 简单元素:没有子元素
                            <!ELEMENT 元素名称 (#PCDATA)>
                3.需要在xml文件中引入dtd文件
                            <!DOCTYPE 根元素名称 SYSTEM "DTD的路径">
            ** 打开xml文件使用浏览器打开,浏览器只负责校验xml的语法,不负责校验约束
            ** 如果校验xml的约束,要用MYECLIPSE

            * dtd文件的引入方式(3种)
                1)引入外部的dtd文件
                    <!DOCTYPE 根元素名称 SYSTEM "DTD的路径">
                2)使用内部的dtd文件
                    <!DOCTYPE 根元素名称 [
                        <!ELEMENT 复杂元素名称 (子元素1,子元素2...)>
                        <!ELEMENT 简单元素名称 (#PCDATA)>
                        <!ELEMENT 简单元素名称 (#PCDATA)>
                        <!ELEMENT 简单元素名称 (#PCDATA)>
                        ......
                    ]>
                3)使用外部的dtd文件(网络上的dtd文件)
                        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">

            * dtd定义元素
                    * 语法:<!ELEMENT 元素名 约束>

                    * 简单元素:没有子元素的元素
                            <!ELEMENT name (#PCDATA)>
                            - (#PCDATA) 约束name是字符串的类型
                            - EMPTY 约束元素为空,没有内容
                            - ANY 任意类型

                    * 复杂元素
                            <!ELEMENT 元素名 (子元素列表)>

                        表示子元素出现的次数:

                            - + 表示一次或多次
                            - ? 表示零次或一次
                            - * 表示零次或多次

                    * 子元素直接用逗号隔开,表示元素出现的顺序
                    * 子元素直接用 | 隔开,表示只能出现其中的任意一个

            * 使用dtd定义属性
                    ** 语法:
                    <!ATTLIST 元素名称
                            属性名称 属性类型 属性的约束
                    >
                    ** 属性类型
                        - CDATA 字符串
                            <!ATTLIST birthday
                                ID1 CDATA #REQUIRED
                            >

                        - 枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
                            ** 红绿灯效果
                            ** (a|b|c)
                            <!ATTLIST age
                                ID2 (a|b|c)  #REQUIRED
                            >

                        - ID:值只能是字母或者下划线开头
                            <!ATTLIST name
                                ID3 ID #REQUIRED
                            >

                    ** 属性的约束
                        - #REQUIRED:属性必须存在

                        - #IMPLIED:属性可有可无

                        - #FIXED:表示一个固定值  #FIXED  "AAA"
                                *** 属性的值必须是设置的这个固定值
                                *** <!ATTLIST sex 
                                            ID4 CDATA #FIXED "ABC"
                                    >
                        - 直接值 
                                * 不写属性,使用直接值
                                * 写了属性,使用设置的值
                                <!ATTLIST school
                                        ID5 CDATA "www"
                                >
11、实体的定义
        * 语法 <!ENTITY 实体名称 实体内容>
            <!ENTITY TEST "AAAA">
            使用实体 &实体名称; 比如 &TEST;

xml的解析

12、xml的解析的简介
        * xml是标记型语言
        * js使用dom解析标记性文档?
            - 根据html的层级结构,在内存中分配一个树形结构,把html的标签、属性和文本都封装成对象
            - document对象、element对象、属性对象、文本对象、Node节点对象

        * xml的解析方式(技术):dom 和 sax

            - dom:根据xml的层级结构在内存中分配一个树形结构
                缺点:如果文件过大,容易造成内存溢出
                优点:很方便的实现增删改操作
            - sax:采用事件驱动,边读边解析
                从上到下,一行一行解析,解析到某一对象,返回对象名称
                缺点:不能实现增删改
                优点:如果文件过大,不会造成内存溢出

        * 想要解析xml,首先需要解析器
        ** 不同公司和组织提供了针对dom和sax的解析器,通过api方式提供
        ** sun公司提供的针对dom和sax的解析器..jsxp
            dom4j组织.........................dom4j(开发中用这个)
            jdom..............................jdom

13、jaxp的api的查看
        ** jaxp是javase的一部分

        ** jaxp解析器在jdk的javax.xml.parser包里面
                *** 四个类
                    dom:
                        DocumentBuilder:解析器类
                            - 这个类是抽象类,不能new
                                    此类的实例用DocumentBuilderFactory.newDocumenttBuilder();方法获取
                            - 一个方法,可以解析xml  parse("xml路径") 返回是Document 整个文档
                            - 返回的document是个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找

                            - 在document里的方法
                                * getElementsByTagName(String tagname)
                                    -- 这个方法可以得到标签,返回集合 NodeList

                                * createElement(String tagName)
                                    -- 创建标签

                                * createTextNode(String data)
                                    -- 创建文本

                                * appendChild(Node newChild)
                                    -- 把文本添加到标签下面

                                * removeChild(Node oldchild)
                                    -- 删除节点

                                * getParentNode()
                                    -- 获取父节点

                                * getTextContent()
                                    -- 得到具体值

                                NodeList 
                                - getLength()  得到集合的长度
                                - item(int index) 下标取到具体的值

                                NodeList list
                                for(int i=0;i< list.getLength();i++){
                                        list.item(i);
                                }
                        DocumentBuilderFactory:解析器工厂
                            - 这个类是抽象类,不能new
                                    newInstance()获取DocumentBuilderFactory的实例

                    sax:
                        SAXParser:解析器类
                        SAXParserFactory:解析器工厂

dom的解析过程

这里写图片描述

sax的解析过程

这里写图片描述

schema以及sax的解析


1、schema约束
        ** 符合xml的语法,xml语句
        ** 一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)
        ** dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
                *** 比如 年龄只能是证书,在schema可以直接定义一个整数类型
        ** schema语法更加复杂,schema目前不能代替dtd

2、schema的快速入门
        * 创建schema文件 后缀 .xsd
                ** 根节点 <schema>
        * 在schema文件里面
                属性 <scheam xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://www.baidu.com/2018"
                elementFormDefault="qualified"
                >
                        ** xmlns="http://www.w3.org/2001/XMLSchema"
                            - 表示当前xml文件是一个约束文件

                        ** targetNamespace="http://www.baidu.com/2018"
                            - 使用schema约束条件,直接通过这个地址引入约束条件

                        ** elementFormDefault="qualified"
          步骤:
                1)看xml中有多少个元素
                        <element>
                2)复杂元素和简单元素
                    <element name="person">     //复杂元素
                        <complexType>
                            <sequence>          //表示子元素的出现是按顺序的
                                <element name="name" type="string"></element>   //简单元素
                                <element name="age" type="integer"></element>
                            </sequence>
                        </complexType>
                    </element>
                3)在被约束文件xml引入约束文件xsd
                    <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns="http://www.baidu.com/2018"
                    xsi:schemaLocation="http://www.baidu.com/2018 1.xsd"
                    >
                    **  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                            - 表示xml是一个被约束的文件
                    ** xmlns="http://www.baidu.com/2018"
                            - 是约束文档里面 targetNamespace
                    ** xsi:schemaLocation="http://www.baidu.com/2018 1.xsd"
                            - targetNamespace + 空格 + 约束文档的地址路径

        * sequence  约束子元素是按顺序的

        * all       元素只能出现一次

        * choice    元素只能出现其中的一个

        * any       表示任意元素

        * maxOccurs 放在element标签中,限制element出现的次数
                    - unbounded:无限制的出现
                        maxOccurs="unbounded"
        * 可以约束属性
                在.xsd文件中
                <attribute name="id1" type="int" use="required"></attribute>
                </complexType>
                    name:属性名称
                    type:属性类型 int String
                    use:属性是否必须出现 required

        * 复杂的约束

3、sax的解析过程
        * sax方式:事件驱动、边读边解析
        * 在java.xml.parsers包里面
                ** SAXParser
                        此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
                        - parser(File f,DefaultHandler dh)
                                * 参数1xml的路径
                                  参数2:事件处理器

                ** SAXParserFactory
                        实例 newInstance() 方法得到

        * 画图分析sax的执行过程
                * 当解析到开始标签时,自动执行startElement方法
                * 当解析到文本时,自动执行characters方法
                * 当解析到结束标签时,自动执行endElement方法

4、使用jaxp的sax方式解析xml
-------------------

        * sax方式不能实现增删改操作,只能做查询操作
        ** 打印出整个文档
        *** 执行parse方法,第一个参数xml路径,第二个参数是事件处理器
                ** 创建一个类,集成事件处理器的类
                ** 重写里面的三个方法

        * 获取到所有的name元素的值
                ** 定义一个成员变量 flag=false
                ** 判断开始方法是否是name元素,如果是name元素,把flag值设置成true
                ** 如果flag值是true,在characters()方法里打印内容
                ** 当执行到结束方法的时候,把flag值设置成false

        * 获取第一个name元素的值
                ** 定义一个成员变量 idx=1
                ** 在结束方法时候,idx+1  idx++
                ** 想要打印出第一个name元素的值
                        - 在characters()方法里面判断
                        - 判断flag=true && idx=1 ,再打印内容

使用dom4j解析xml的讲解

5、使用dom4j解析xml
        * dom4j,是一个组织没针对xml解析,提供解析器 dom4j

        * dom4j不是javase的一部分,所以使用时需要:
                ** 导入dom4j提供jar包
                    - 创建一个文件夹 lib
                    - 复制jar包到lib下
                    - 右键点击jar包 ,build path ->add to buildpath

        * 得到document
                    SAXReader reader=new SAXReader();
                    Document document=reader.read(url);
        * document的父接口是Node
                    * 如果在document里面找不到想要的方法,到Node里去找
        * document里面的方法 getRootElement():获取根节点  返回的是Element
        * Element也是一个接口,父接口是Node
                    - Element和Node里面方法
                    ** getParent():获取父节点
                    ** addElement:添加标签

                    * element(qname)
                        - 表示获取标签下面的第一个子标签
                        - qname:标签的名称
                    * elements(qname)
                        - 获取标签下面是这个名称的所有子标签(一层)
                        - qname:标签名称
                    * elements()
                        - 获取标签下边的所有一层子标签

6、使用dom4j查询xml
        * 查询所有name元素里面的值
                步骤: 1、创建解析器
                        2、得到document
                        3、得到根节点
                        4、得到所有的p1标签     
                        5、得到name
                        6、得到name里面的值
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                List<Element> list=root.elements("p1");
                for(Element element:list){
                    Element name1=list.element("name");
                    String s=name1.getText();
                    system.out.println(s);
                }

        * 查询第一个name元素里面的值
                步骤: 1、创建解析器
                        2、得到document
                        3、得到根节点
                        4、得到第一个p1元素
                        5、得到p1下面的name元素
                        6、得到name元素里面的值
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                Element p1=root.element("p1");
                Element name1=p1.element("name");
                String s=name1.getText();
                system.out.println(s);

7、使用dom4j实现添加操作
        *在第一个p1标签末尾添加一个元素<sex>nv</sex>
                        4、获取到第一个p1
                        5、在p1下边添加元素
                        6、在添加完成之后的元素下面添加文本
                        7、回写xml
                        8、关流
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                Element p1=root.element("p1");
                //在p1下边直接添加元素
                Element sex1=p1.addElement("sex");
                //直接添加文本内容
                sex1.setText("nv");
                //回写xml
                OutputFormat format=OutputFormat.createPrettyPrint();       //这个方法xml会有缩进的效果
                //OutputFormat format=OutputFormat.createCompactFormat();   这个方法xml一行输出
                XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
                xmlWriter.write(document);
                xmlWriter.close();

8、在特定位置添加元素
        * 在第一个p1下面的age标签之前添加school标签
                        4、获取到第一个p1
                        5、获取到p1下面的所有元素
                                ** elements() 返回list集合
                                ** 使用list里面的方法,在特定位置添加元素
                                ** 创建新的元素标签并写内容
                                    - 创建新标签用DocumentHelper类
                                **add(int index,E element)
                                    - 第一个参数是 位置下标,从0开始
                                    - 第二个参数是 要添加的元素
                        6、回写xml
                        7、关流
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                Element p1=root.element("p1");
                List<Element> list=p1.elements();
                Element school=DocumentHelper.createElement("school");
                school.setText("high");
                list.add(1,school);
                OutputFormat format=OutputFormat.createPrettyPrint();
                XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
                xmlWriter.writer(document);
                xmlWriter.close();

9、使用dom4j实现修改节点的操作
        * 修改第一个p1下面的age元素的值<age>30</age>
                        1、得到document和根节点root
                        2、得到第一个p1元素
                        3、得到第一个p1下面的age
                        4、修改值是30
                        5、回写xml
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                Element p1=root.element("p1");
                Element age=p1.element("age");
                //修改操作
                age.setText("30");
                OutputFormat format=OutputFormat.createPrettyPrint();
                XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
                xmlWriter.writer(document);
                xmlWriter.close();

10、使用dom4j实现删除操作
        * 删除第一个p1下面的school元素
                        1、得到document和根节点root
                        2、得到第一个p1元素
                        3、得到第一个p1下面的school
                        4、删除(使用父节点p1来删除)
                        5、回写xml
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                Element p1=root.element("p1");
                Element school=p1.element("school");
                //删除操作
                //获取父节点:school.getParent();返回的是element
                p1.remove(school);
                OutputFormat format=OutputFormat.createPrettyPrint();
                XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
                xmlWriter.writer(document);
                xmlWriter.close();

11、使用dom4j获得属性值的操作
        * 获取第一个p1里面的属性id1的属性值
                        1、得到document和根节点root
                        2、得到第一个p1元素
                        3、得到第一个p1里面的属性值
                SAXReader saxreader=new SAXReader();
                Document document=saxreader.read("src/p1.xml");
                Element root=document.getRootElement();
                Element p1=root.element("p1");
                //得到p1里面的属性值
                String value=p1.attributeValue("id1");
                System.out.println(value);

12、使用dom4j支持xpath的操作
        * 可以直接获取到某个元素

        * 第一种形式:/AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB

        * 第二种形式://BBB:表示和这个名称相同,表示只要名称是BBB,都得到

        * 第三种形式:/* : 表示所有元素

        * 第四种形式:BBB[1]:表示第一个BBB元素
                      BBB[last()] : 表示最后一个BBB元素

        * 第五种形式://BBB[@id]:表示只要BBB元素上面有id属性,都得到

        * 第六种形式://BBB[@id='1']:表示只要BBB元素上面有id属性,并且属性值=1

13、使用dom4j支持xpath具体操作
        ** 默认情况下,dom4j里面是有xpath
        ** 如果想要在dom4j里面是有xpath
                * 第一步需要,引入支持xpath的jar包,使用 jaxen-1.1-bate-6.jar
                * 需要把jar包导入到项目中

        ** 在dom4j里面提供了两个方法,用来支持xpath
                *** selectNodes("xpath表达式")
                        获取多个节点
                *** selectSingleNode("xpath表达式")
                        获取一个节点

        ** 使用xpath实现:查询xml中所有name元素的值
                ** 所有name元素的xpath表示://name
                ** 使用selectNodes("//name")
                        步骤: 1、得到document
                                2、直接用selectNodes("//name")得到所有name元素
                    SAXReader saxreader=new SAXReader();
                    Document document=saxreader.read("src/p1.xml");
                    List<Node> list=document.selectNodes("//name");
                    for(Node node:list){
                        //node是每一个name元素
                        String s=node.getText();
                        system.out.println(s);
                    }

        ** 使用xpath实现:获取第一个p1下面name的值
                ** 使用selectSingleNode("//p1[@id='1']/name")
                代码:
                    SAXReader saxreader=new SAXReader();
                    Document document=saxreader.read("src/p1.xml");
                    Node name1=document.selectSingleNode("//p1[@id='1']/name");
                    String s=name1.getText();
                    system.out.println(s);

14、实现简单的学生管理系统
        ** 使用xml当做数据,存储学生信息
        ** 创建一个xml文件,写一些学生信息

        ** 增加操作:    1、创建解析器
                        2、得到document
                        3、获取根节点
                        4、在根节点上面创建stu标签
                        5、在stu标签上面依次添加id、name、age
                                - addElement()方法添加
                        6、在id name age 上面依次添加值
                                - setText()方法
                        7、回写xml

        ** 删除操作(根据id删除):    
                        3、获取所有的id
                                - 使用xpath  //id  返回list集合
                        4、遍历集合
                        5、判断集合里面的id和传递的id是否相同
                        6、如果相同,把id所在的stu删除

        ** 查询操作(根据id查询):
                        3、获取所有的id
                        4、返回的是list集合,遍历list集合
                        5、得到每一个id的节点
                        6、id节点的值
                        7、判断id的值和传递的id值是否相同
                        8、如果相同,先获取到id的父节点stu
                        9、通过stu获取到name  age值











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值