JavaWeb——XML

一、xml的简介(了解)

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

3、xml是w3c(万维网)组织发布的技术 
4、xml有两个版本 1.0  1.1
        - 使用都是1.0版本,(1.1版本不能向下兼容)

二、xml的应用

1、不同的系统之间传输数据
     ** qq之间数据的传输

2、用来表示生活中有关系的数据
        
3、经常用在文件配置
     * 比如现在连接数据库,肯定知道数据库的用户名和密码,数据名称 
     * 如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了

三、xml的语法

1、xml的语法(***)

  • xml文档的后缀名 .xml
  • xml第一行必须定义为文档声明(在第一行把它回车放第二行也不行)
  • xml文档中有且仅有一个根标签
  • 属性值必须使用引号(单双都可)引起来
  • 标签必须正确关闭
  • xml标签名称区分大小写
<?xml version='1.0' ?>
<users>
    <user id='1'>
        <name>zhangsan</name>
        <age>23</age>
        <gender>male</gender>
        <br/>
    </user>
				
    <user id='2'>
        <name>lisi</name>
        <age>24</age>
        <gender>female</gender>
    </user>
</users>

       xml文档声明的属性
            - version:xml的版本 1.0(使用) 1.1
            - encoding:xml编码 gbk  utf-8  iso8859-1(不包含中文)
            - standalone:是否需要依赖其他文件 yes/no
        
        * xml的中文乱码问题解决
            ** 画图分析乱码问题
            ** 保存时候的编码和设置打开时候的编码一致,不会出现乱码

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

四、xml的元素(标签)定义

    ** 标签定义

    ** 标签定义有开始必须要有结束:<person></person>
    ** 标签没有内容,可以在标签内结束 ; <aa/>
    ** 标签可以嵌套,必须要合理嵌套
        *** 合理嵌套 <aa><bb></bb></aa>
        *** 不合理嵌套 <aa><bb></aa></bb>: 这种方式是不正确的
    ** 一个xml中,只能有一个根标签,其他标签都是这个标签下面的标签

    ** 在xml中把空格和换行都当成内容来解析,
        **** 下面这两段代码含义是不一样的
        * <aa>1111111</aa>
        * <aa>
            11111111111
          </aa>
    
    ** xml标签可以是中文

    ** xml中标签的名称规则
        (1)xml代码区分大小写
            <p> <P>:这两个标签是不一样的
        (2)xml的标签不能以数字和下划线(_)开头
            <2a> <_aa>: 这样是不正确的
        (3)xml的标签不能以xml、XML、Xml等开头
            <xmla> <XmlB> <XMLC>: 这些都是不正确的
        (4)xml的标签不能包含空格和冒号
            <a b> <b:c> : 这些是不正确的

五、xml中属性的定义

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

    * <person id1="aaa" id2="bbb"></person>

    ** 属性定义的要求
        (1)一个标签上可以有多个属性
            <person id1="aaa" id2="bbb"></person>
        (2)属性名称不能相同
            <person id1="aaa" id1="bbb"></person>:这个是不正确,不能有两个id1
        (3)属性名称和属性值之间使用= ,属性值使用引号包起来 (可以是单引号,也可以是双引号 )
        (4)xml属性的名称规范和元素的名称规范一致

六、xml中的注释

    * 写法 <!-- xml的注释 -->
    ** 注意的地方
        **** 注释不能嵌套
            <!--  <!-- -->  -->
            <!-- <!-- <sex>nv</sex>--> -->
    ** 注释也不能放到第一行,第一行第一列必须放文档声明

七、xml中的特殊字符

    * 如果想要在xml中现在 a<b ,不能正常显示,因为把<当做标签
    * 如果就想要显示,需要对特殊字符 < 进行转义
    ** <    &lt;
        >    &gt;

八、CDATA区(了解)

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

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

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

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

    ** xml的语法的总结
        所有 XML 元素都须有关闭标签
        XML 标签对大小写敏感
        XML 必须正确地嵌套顺序
        XML 文档必须有根元素(只有一个)
        XML 的属性值须加引号
        特殊字符必须转义 --- CDATA
        XML 中的空格、回车换行会解析时被保留

十、xml的约束

1、定义:规定xml文档的书写规则

作为框架的使用者(程序员):

  1. 能够在xml中引入约束文档
  2. 能够简单的读懂约束文档

2、xml的约束分类 : dtd约束 和 schema约束 (看懂)

十一、dtd的快速入门

1、创建一个文件 后缀名 .dtd

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

3、如果想要校验xml的约束,需要使用工具(idea工具)

十二、dtd的三种引入方式

(1)引入外部的dtd文件
        <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
(2)使用内部的dtd文件
        - <!DOCTYPE 根元素名称 [
            <!ELEMENT person (name,age)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
        ]>
(3)使用外部的dtd文件(网络上的dtd文件)
        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
        - 后面学到框架 struts2 使用配置文件 使用 外部的dtd文件
        - <!DOCTYPE struts PUBLIC   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    
           "http://struts.apache.org/dtds/struts-2.0.dtd">

十三、使用dtd定义元素

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

    * 简单元素:没有子元素的元素
        <!ELEMENT name (#PCDATA)>
        *** (#PCDATA): 约束name是字符串类型
        *** EMPTY : 元素为空(没有内容)
            - <sex></sex>
        *** ANY:任意
    * 复杂元素:
        <!ELEMENT person (name,age,sex,school)>
            - 子元素只能出现一次
        * <!ELEMENT 元素名称 (子元素)>

        * 表示子元素出现的次数
            + : 表示一次或者多次
            ? :表示零次或者一次
            * :表示零次或者多次
        
        * 子元素直接使用逗号进行隔开 ,
            ** 表示元素出现的顺序

        * 子元素直接使用|隔开
            ** 表示元素只能出现其中的任意一个

十四、使用dtd定义属性

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

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

        - ID: 值只能是字母或者下划线开头
            - <!ATTLIST name 
                ID3 ID   #REQUIRED
            >
    
    * 属性的约束
        - #REQUIRED:属性必须存在

        - #IMPLIED:属性可有可无

        - #FIXED: 表示一个固定值 #FIXED "AAA"
            - 属性的值必须是设置的这个固定值
            - <!ATTLIST sex
                ID4 CDATA #FIXED "ABC"
            >
        - 直接值
            * 不写属性,使用直接值
            * 写了属性,使用设置那个值
            - <!ATTLIST school
                ID5 CDATA "WWW"
            >

    * 实体的定义

    * 语法: <!ENTITY 实体名称 "实体的值">
    *** <!ENTITY TEST "HAHAHEHE">
    *** 使用实体 &实体名称;  比如 &TEST;

    ** 注意
        * 定义实体需要写在内部dtd里面,
          如果写在外部的dtd里面,有某些浏览器下,内容得不到

十五、Schema约束

* 引入:
          1.填写xml文档的根元素
          2.引入xsi前缀.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          3.引入xsd文件命名空间.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
          4.为每一个xsd约束声明一个前缀,作为标识  xmlns="http://www.itcast.cn/xml" 

<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://www.itcast.cn/xml"
          xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd">

例子:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"//不用起别名
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"//起context的别名
    xmlns:mvc="http://www.springframework.org/schema/mvc"//起mvc的别名
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    
    <context:annotation-config />
    <mvc:resources mapping="/resources/**" location="/resources/" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsps/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

十六、xml的解析的简介(重要)

    * xml是标记型文档
    * js使用dom解析标记型文档?
        - 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
        - document对象、element对象、属性对象、文本对象、Node节点对象
    
    * xml的解析方式(技术):dom 和 sax
        ** 画图分析使用dom和sax解析xml过程


        *** dom解析和sax解析区别:
        ** dom方式解析
            * 根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象,一次性加载进内存
            * 缺点:如果文件过大,造成内存溢出
            * 优点:很方便实现增删改操作

        ** sax方式解析
            * 采用事件驱动,边读边解析
                - 从上到下,一行一行的解析,解析到某一个对象,返回对象名称
            * 缺点:不能实现增删改操作
            * 优点:如果文件过大,不会造成内存溢出,方便实现查询操作
    
    * 想要解析xml,首先需要解析器
    ** 不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供
    *** sun公司提供了针对dom和sax解析器  jaxp
    *** dom4j组织,针对dom和sax解析器    dom4j(*** 实际开发中****)
    *** jdom组织,针对dom和sax解析器     jdom

十七、使用dom4j解析xml

1、dom4j,是一个组织,针对xml解析,提供解析器 dom4j

2、dom4j不是javase的一部分,想要使用第一步需要怎么做?
        *** 导入dom4j提供jar包
        -- 创建一个文件夹 lib
        -- 复制jar包到lib下面,
        -- 右键点击jar包,build path -- add to build path
        -- 看到jar包,变成奶瓶样子,表示导入成功
    
    * 得到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()
            ** 获取标签下面的所有一层子标签

十八、使用dom4j查询xml

    * 解析是从上到下解析
    * 查询所有name元素里面的值
        /*
            1、创建解析器
            2、得到document
            3、得到根节点  getRootElement() 返回Element

            4、得到所有的p1标签
                * elements("p1") 返回list集合
                * 遍历list得到每一个p1
            5、得到name
                * 在p1下面执行 element("name")方法 返回Element
            6、得到name里面的值
                * getText方法得到值
        */
    
    * 查询第一个name元素的值
        /*
         * 1、创建解析器
         * 2、得到document
         * 3、得到根节点
         * 
         * 4、得到第一个p1元素  
            ** element("p1")方法 返回Element
         * 5、得到p1下面的name元素
            ** element("name")方法 返回Element
         * 6、得到name元素里面的值
            ** getText方法
         * */
    * 获取第二个name元素的值
        /*
         * 1、创建解析器
         * 2、得到document
         * 3、得到根节点
         * 
         *  4、得到所有的p1 
            ** 返回 list集合
         *  5、遍历得到第二个p1
            ** 使用list下标得到 get方法,集合的下标从 0 开始,想要得到第二个值,下标写 1 
         *  6、得到第二个p1下面的name
            ** element("name")方法 返回Element
         *  7、得到name的值
            ** getText方法
         * */

十九、使用dom4j实现添加操作

    * 在第一个p1标签末尾添加一个元素 <sex>nv</sex>
    * 步骤
        /*
         * 1、创建解析器
         * 2、得到document
         * 3、得到根节点
         * 
         * 4、获取到第一个p1
            * 使用element方法
         * 5、在p1下面添加元素
            * 在p1上面直接使用 addElement("标签名称")方法 返回一个Element

         * 6、在添加完成之后的元素下面添加文本
         *    在sex上直接使用 setText("文本内容")方法
         * 7、回写xml
            * 格式化 OutputFormat,使用 createPrettyPrint方法,表示一个漂亮的格式
            * 使用类XMLWriter 直接new 这个类 ,传递两个参数
                *** 第一个参数是xml文件路径 new FileOutputStream("路径")
                *** 第二个参数是格式化类的值
         * */

二十、使用dom4j实现在特定位置添加元素

     * 在第一个p1下面的age标签之前添加 <school>ecit.edu.cn</schlool>
    * 步骤
        /*
         * 1、创建解析器
         * 2、得到document
         * 3、得到根节点
         * 4、获取到第一个p1
         * 
         * 5、获取p1下面的所有的元素
         *         ** elements()方法 返回 list集合

         *      ** 使用list里面的方法,在特定位置添加元素
         *        ** 首先创建元素 在元素下面创建文本
                    - 使用DocumentHelper类方法createElement创建标签
                    - 把文本添加到标签下面 使用 setText("文本内容")方法

         *          *** list集合里面的 add(int index, E element)
         *              - 第一个参数是 位置 下标,从0开始
         *              - 第二个参数是 要添加的元素
         * 6、回写xml
         * */

    ** 可以对得到document的操作和 回写xml的操作,封装成方法
    ** 也可以把传递的文件路径,封装成一个常量
    *** 好处:可以提高开发速度,可以提交代码可维护性
        - 比如想要修改文件路径(名称),这个时候只需要修改常量的值就可以了,其他代码不需要做任何改变

二十一、使用dom4j实现修改节点的操作

    * 修改第一个p1下面的age元素的值 <age>30</age>
    * 步骤
    /*
         * 1、得到document
         * 2、得到根节点,然后再得到第一个p1元素
         * 3、得到第一个p1下面的age
            element("")方法
         * 4、修改值是 30
         *    * 使用setText("文本内容")方法
         * 5、回写xml
         * 
         * */

二十二、使用dom4j实现删除节点的操作

    * 删除第一个p1下面的<school>ecit</school>元素
    * 步骤
    /*
         * 1、得到document
         * 2、得到根节点
         * 3、得到第一个p1标签
         * 4、得到第一个p1下面的school元素

         * 5、删除(使用p1删除school)
         *    * 得到school的父节点
                - 第一种直接得到p1
                - 使用方法 getParent方法得到
            * 删除操作
                - 在p1上面执行remove方法删除节点
         * 6、回写xml
         * */

二十三、使用dom4j获取属性的操作

    * 获取第一个p1里面的属性id1的值
    * 步骤
    /*
         * 1、得到document
         * 2、得到根节点
         * 3、得到第一个p1元素
         * 4、得到p1里面的属性值
            - p1.attributeValue("id1");
            - 在p1上面执行这个方法,里面的参数是属性名称
         * */

二十四、使用dom4j支持xpath的操作

    * 可以直接获取到某个元素 

    * 第一种形式
        /AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB
    * 第二种形式
        //BBB: 表示和这个名称相同,表示只要名称是BBB,都得到
    * 第三种形式
        /*: 所有元素
    * 第四种形式
        ** BBB[1]: 表示第一个BBB元素
        ×× BBB[last()]:表示最后一个BBB元素
    * 第五种形式
        ** //BBB[@id]: 表示只要BBB元素上面有id属性,都得到
    * 第六种形式
        ** //BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

二十五、使用dom4j支持xpath具体操作

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

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

    ** 使用xpath实现:查询xml中所有name元素的值
        ** 所有name元素的xpath表示: //name
        ** 使用selectNodes("//name");

** 代码和步骤
/*
 * 1、得到document
 * 2、直接使用selectNodes("//name")方法得到所有的name元素
 * 
 * */
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//使用selectNodes("//name")方法得到所有的name元素
List<Node> list = document.selectNodes("//name");
//遍历list集合
for (Node node : list) {
    //node是每一个name元素
    //得到name元素里面的值
    String s = node.getText();
    System.out.println(s);
}

   ** 使用xpath实现:获取第一个p1下面的name的值
        * //p1[@id1='aaaa']/name
        * 使用到 selectSingleNode("//p1[@id1='aaaa']/name")

* 步骤和代码
/*
 * 1、得到document
 * 2、直接使用selectSingleNode方法实现
 *     - xpath : //p1[@id1='aaaa']/name
 * */
//得到document
Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
//直接使用selectSingleNode方法实现
Node name1 = document.selectSingleNode("//p1[@id1='aaaa']/name"); //name的元素
//得到name里面的值
String s1 = name1.getText();
System.out.println(s1);


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值