JAVAEE--XML语言和DTD约束和解析xml文件方式DOM4J


day05

1、上节内容回顾
    
2、表单提交方式
    * 使用type="submit"
        - <input type="submit" value="提交"/>
    * 使用type="button"
        - //获取到form
        var form1 = document.getElementById("form1");
        //设置action
        form1.action = "1.html";
        //实现提交 submit();
        form1.submit();

    * 事件
        - onclick:鼠标点击事件

        - onchange:改变事件(经常和下拉框一起使用)

        - onfocus: 获取焦点事件,在一些浏览器版本低 ie6
        - onblur:失去焦点

3、xml简介和应用
    * 是什么?做什么?怎么做?
    * eXtensible Markup Language:可扩展标记型语言
    ** 标记型语言:使用标签进行操作 html、xml
    ** 可扩展:html里面的标签是固定 <font> <br/>  ; xml中标签是自定义 (可以包含中文标签名)<perosns> <猫> <狗>
    ** xml是为了传输数据

    * 应用:
        1、用于系统间数据的传输
            * 画图分析qq直接数据的传输
        2、用于表示生活中有关系的数据
            
        3、用在配置文件中

4、xml的语法-文档声明
    * 如果要创建一个xml文档,必须要有一个文档声明
    * 格式: <?xml version="1.0" encoding="utf-8"?>

    ** version(必须要有): 表示xml的版本 1.0 1.1(要是有1.0 ,因为1.1版本不会向下兼容)

    ** encoding(可选): xml文档的编码方式 utf-8  gbk (gb2312 gb2310)  iso8859-1
    ** standalone(可选):表示文档是否是独立的文档

    * 注意的问题:
    1、文档声明必须要放在第一行第一列
    2、xml文档的编码方式要和浏览器默认的编码方式一致

5、xml的元素(标签)定义
    * 自定义的标签 <person></person> <猫></猫>
    * 标签定义有开始必须要有结束 <person> aaa </person>  <p1/>
    * 标签必须是合理嵌套
        <p1><p2></p1></p2> :这种方式是不正确的
        <p1> <p2></p2></p1>
    * xml文档只能有一个根标签

    ** 标签的命名规范
    1、区分大小写 <person ><PERSON> 这两个标签是不一样的
    2、标签不能以数字或者下划线开头 <1a>  <_aa> 这两种是不正确的
    3、不能以xml(或XML、或Xml 等)开头。
    4、 不能包含空格。 <a b> 不正确的
    5、名称中间不能包含冒号(:)。 <aa:bb> 不正确的

    ** xml解析的时候会把空格和换行都当成内容来处理

6、xml的属性定义
    * 每个标签可以有多个属性,但是属性不能相同
    * 属性和属性值之间使用引号(单引号和双引号)
    * 属性名称的命名规范和元素名称的命名规范相同

7、xml的注释
    *格式: <!-- xml注释 -->
    * 注释不能嵌套  
        ** <!--   <!-- xml注释 -->   -->  不正确的

8、转义字符
    < : &lt;
    > : &gt;

    & : &amp;
    " : &quot;
    ' : &apos;

9、CDATA区
    * character data
    * 把CDATA区里面的内容直接作为字符串来显示出来,而不是作为标签来操作
    * 语法:<![CDATA[内容]]>

    <![CDATA[ 内容 ]]>

10、处理指令(鸡肋)
    * xml设置样式
    ** <?xml-stylesheet type="text/css" href="some.css"?>
    * 对中文命名的标签元素不起作用
    * 处理指令不能放在第一行,第一行必须要放文档声明

            
11、xml的约束
    常用的有两种约束技术: dtd  和 schema
    * 什么是约束?为什么xml需要约束?
        * 比如定义xml文档,定义person,想让里面只能出现人的一些信息,name、age,只能出现人的信息
        但是xml定义的标签自定义,a、b、面积,这些内容肯定不是人的信息,所以这个时候需要对xml文档进行约束,
        约束xml里面只能出现人的属性。

    * dtd快速入门
        1、创建xml文档
        2、创建一个约束文件 后缀名 .dtd
            ** 语法 <!ELEMENT 元素名称 元素类型>
        dtd步骤:
            1、保存dtd文件
            2、看xml中有多少个元素
                <!ELEMENT 元素名称 元素类型>

            3、看这个元素是简单元素还是复杂元素
                * 有子元素的元素是复杂元素
                    <!ELEMENT 元素名称 (子元素)>
                * 没有子元素的元素是简单元素
                    <!ELEMENT 元素名称 (#PCDATA)>
            ** <!ELEMENT person (name,age)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>

        * 浏览器可以直接解析xml,但是浏览器并不负责校验xml
        * 如果想要校验xml使用校验工具 myeclipse校验

        * <!ELEMENT person (name,age)> //person复杂元素  (name,age):是person下面的子元素
        <!ELEMENT name (#PCDATA)>  //name是简单元素  (#PCDATA):类型
        <!ELEMENT age (#PCDATA)>

        * 在xml中引入dtd
        <!DOCTYPE 根元素名称 SYSTEM "dtd路径">

12、dtd的引入方式
    * 使用引入外部dtd
        <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
    * 使用内部的dtd
        * 把dtd代码写在xml中
        * <!DOCTYPE person [
            <!ELEMENT person (name,age)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
        ]>
        * <!DOCTYPE 根元素名称 [
            dtd代码
        ]>
    * 使用公共的dtd约束
        * <!DOCTYPE 根元素名称 PUBLIC “DTD名称” “DTD文档的URL”>

13、dtd定义元素(约束元素)
    * dtd语法 <!ELEMNT 元素名称 使用规则>
    ** 使用规则
        * 如果元素是简单元素时候 :
            ** (#PCDATA): 字符串
            ** EMPTY: 空
            ** ANY:任何类型
            - <!ELEMENT age (#PCDATA)>
            <!ELEMENT sex EMPTY>
            <!ELEMENT love ANY>

        * 如果是复杂元素时候 (子元素名称)
            ** (name,age,sex): 表示元素要按照设置的顺序出现
            ** (name|age|sex): 只能出现其中的一个

            ** 设置元素出现的次数
                - 使用+ : 出现一次或者多次
                - 使用* :出现零次或者多次
                - 使用? :出现零次或者一次
            - <!ELEMENT person (name+,age*,sex,love?)>

14、dtd定义属性
    * 格式:
        <!ATTLIST 元素名称
            属性名称1 属性类型 属性约束
            属性名称2 属性类型 属性约束
            ....
        >
    * 属性类型
        ** CDATA: 字符串
        ** 枚举:表示只能在一定范围内出现其中的一个内容
            - 没有特定的关键字
            - (name|age|sex)
        ** ID类型 :只能使用字母和下划线开头 ,用于区分元素
    
    * 属性约束
        * #REQUIRED: 表示属性必须要出现
        * #IMPLIED:表示属性可有可无的
        * 固定值 #FIXED "ABC": 表示属性的值必须是设置的这个值
        * 直接值:如果没有设置这个属性的值,使用直接值;如果设置了属性的值,使用设置的值

15、dtd定义实体
    * 定义实体要使用内部dtd
    * 每个页面都需要 copyright “传智播客版权所有”,
    * 通过定义实体来定义这个内容,在每个xml中直接调用这个定义的实体,不需要每个xml中都写一遍

    * 格式: <!ENTITY 实体名称 "实体内容">
    * 在xml中如何使用 &实体名称;

    * 注意的问题:在一些版本的浏览器下,定义实体必须要使用内部dtd,如果使用外部的dtd不好使

16、xml解析简介(******今天最重要的内容 java代码)
    * 解析xml分为两种方式:dom和sax
        ** dom:document  object  model:文档对象模型
            * 根据xml的层级结构在内存中分配一个树形结构
            ** 优点:方便实现增删改操作
            ** 缺点:如果文档过大,会造成内存溢出
        ** sax:
            * 采用事件驱动,边读边解析
            ** 优点:查询方便,不会出现内存溢出
            ** 缺点:无法实现增删改操作

        *** 画图分析一下dom和sax

    * 如果要对xml进行解析,首先必须要有一个解析器
        ** 不同的公司和组织,针对这两种方式 dom和sax,提供了解析器,通过api形式来提供

        1、sun公司提供针对这两种方式的api,JAXP 解析dom和sax
        2(****)、dom4j组织,针对这两种提供了api,dom4j
        3、jdom组织,针对这两种方式提供api,jdom

17、使用JAXP解析xml简介
    * jaxp是sun公司提供的技术,jaxp是javase的一部分 ,jdk文档
    ** 找到 javax.xml.parsers包
        ***使用dom解析 DocumentBuilderFactory和DocumentBuilder

        - DocumentBuilder:表示解析器,但是这个类是抽象类,
        此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取

        - DocumentBuilderFactory:表示解析器工厂,也是一个抽象类
            ** newInstance() 获取 DocumentBuilderFactory 的新实例

    ** 如何获取到jaxp 解析器 DocumentBuilder
    1、获取DocumentBuilderFactory解析器工厂 newInstance()
    2、获取DocumentBuilder解析器,通过 DocumentBuilderFactory.newDocumentBuilder()
    3、使用 DocumentBuilder类里面的parse(String uri) 进行解析
    4、执行完成parse方法之后返回Document(代表整个文档)

    ** 常用方法:
        - getElementsByTagName(String tagname) :根据标签名称得到标签,返回NodeList
        - createElement(String tagName) :创建标签
        - createTextNode(String data) :创建文本
        - appendChild(Node newChild)  : 把文本添加到标签下面

    ** Document是一个接口,父接口是Node

18、使用jaxp实现xml的查询操作
    * 查询name标签里面的内容
    * 1、获取DocumentBuilderFactory解析器工厂 newInstance()
      2、获取DocumentBuilder解析器,通过 DocumentBuilderFactory.newDocumentBuilder()
      3、使用 DocumentBuilder类里面的parse(String uri) 进行解析
      4、执行完成parse方法之后返回Document(代表整个文档)

      5、获取name标签 使用 getElementsByTagName()
      6、返回是NodeList,遍历集合
        ** 获取NodeList长度 getLength()
        ** 获取遍历之后具体值 item()
      7、获取元素里面具体内容
        * getTextContent()方法获取

    * 查询第一个name元素里面的内容
          1、获取DocumentBuilderFactory解析器工厂 newInstance()
          2、获取DocumentBuilder解析器,通过 DocumentBuilderFactory.newDocumentBuilder()
          3、使用 DocumentBuilder类里面的parse(String uri) 进行解析
          4、执行完成parse方法之后返回Document(代表整个文档)
          
          5、获取所有的name元素
          6、直接使用item()方法获取到某个位置的元素
            - document.getElementsByTagName("name").item(1);
            - 开始位置是 0

19、使用jaxp实现xml中添加元素
    * 在第一个p1元素下面添加 <sex>nv</sex>
    *     /*
         * 1、创建解析器工厂
         * 2、根据解析器工厂,创建解析器
         * 3、使用parse方法解析xml
         *
         * 4、获取到第一个p1元素  ,获取到所有p1,使用item方法获取第一个p1
         * 5、创建sex元素 使用createElement方法创建元素
         * 6、创建文本 nv 使用createTextNode方法创建文本
         * 7、把文本添加到sex元素下面  使用appendChild添加
         *
         * 8、把sex元素添加到第一个p1下面 使用appendChild添加
         *
         * 9、回写xml 使用TransFormer
         * */

20、使用jaxp实现xml元素内容修改
    * 把<sex>nv</sex>修改为 <sex>nan</sex>
    * /*
         * 1、创建解析器工厂
         * 2、根据解析器工厂,创建解析器
         * 3、使用parse方法解析xml
         *
         * 4、获取到sex元素
         * 5、实现修改 setTextContent方法
         * 6、回写xml
         * */

21、使用jaxp实现xml删除元素
    * 删除第二个p1元素里面age元素
    * /*
         * 1、创建解析器工厂
         * 2、根据解析器工厂,创建解析器
         * 3、使用parse方法解析xml
         *
         * 4、获取到第二个p1元素下面的age item(1)

         * 5、获取p1元素 父元素 getParent方法

         * 6、执行删除操作 使用 removeChild方法
            - 通过父节点删除(父元素进行删除)
         * 7、回写xml
         *
         * */

22、使用jaxp实现xml的遍历操作
    * 把xml中所有的标签名称显示出来
    *     /*
         * 1、创建解析器工厂
         * 2、根据解析器工厂,创建解析器
         * 3、使用parse方法解析xml
         *
         * 4、使用getChildNodes()获取元素下面的子元素
         * 5、使用递归操作
         *
         * */

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值