XML文件的初识

1.xml

XML 指可扩展标记语言

XML 被设计用来传输和存储数据。

XML 很重要,也很容易学习。

之前见过xml文件吗?见过 c3p0-config.xml

以后开发中比如ssm框架 写的xml相当多!!!慢慢自然而然就会。写多了

xml就是用来存储数据的

html w3c组织定义好的标签

xml 自己定义的标签,全部是双边的标签

 
<?xml version = "1.0" encoding = "UTF-8" ?>
<bookstore>
    <book category = "奇幻书">
        <title lang = "xyj">西游记</title>
        <author>吴承恩</author>
        <year>1886</year>
        <price>138.21</price>
    </book>
    <book category = "儿童书">
        <title lang="ppl">皮皮鲁大冒险</title>
        <author>郑渊洁</author>
        <year>2008</year>
        <price>250.00</price>
    </book>
    <!-- 例子中的根元素是 <bookstore>。只能有一个根。文档中的所有 <book> 元素都被包含在 <bookstore> 中。
<book> 元素有 4 个子元素:<title>、< author>、<year>、<price> -->
</bookstore>

    【注意事项】:
        1.只能那个有一个根元素
        2.标签必须是成双成对的
        3.一定要见名知意
 

你发现一个问题,这些都是胡乱写的,只要能存进去数据就行了。

但是真实的开发中不是这样,你的标签不能胡乱写!!!所以就要加约束了

2.1XML文件约束

1.dtd

文档类型定义(DTD)可定义合法的XML文档构建模块。就意味着你不能够胡乱写了标签了

2.schema

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

2.2dtd约束

创建一个student.dtd文件

<!--students  根节点,要求根节点存放student根标签-->
<!ELEMENT students (student*) >
<!--student 标签的有哪几个子标签-->
<!ELEMENT student (name, age, sex)>
<!--所有子标签当前的数据都是文本形式存在的-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--student还想给一个id属性  ATTLIST   属性列表-->
<!ATTLIST student id ID #PCDATA>
<!--以后记住不用写!!!都是别人封装好的!!!你只需要把人家写好的dtd
引入到你的xml文件中使用即可!!!你没有这个能力写dtd文件ssm都是封装好的。目的
为了程序需要统一化!!
-->
创建一个student.xml文件


<?xml version="1.0" encoding="UTF-8" ?>
<!--如果没有引入dtd文件随便写都不会报错!!!-->
<!--但是引入dtd文件以后只能按照别人约束好的来写!!!-->
<!--引入咱们刚才写好的dtd文件-->
<!--<!DOCTYPE 根元素 SYSTEM "文件名">-->
<!--文件名是一个绝对路径!!!-->
<!DOCTYPE students SYSTEM "D:\javast\untitled5\src\com\qwzstu\test\students.dtd">
<!--写完dtd约束以后 你还能随便写标签吗?不能!!!-->
<students>
    <student id="1">
        <name>张三</name>
        <age>21</age>
        <sex>男</sex>
    </student>
    <student id="2">
        <name>肖五</name>
        <age>23</age>
        <sex>女</sex>
    </student>
</students>

开发并不是用!!!而是去知道有这个东西!!!就是今天我不讲dtd约束你们后面该写代码还是写代码还是很6,因为咱们就就不用去写dtd

2.3schema约束

是DTD的一个替代品,约束的更加严格

1.新建一个xsd文件

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.qwz.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.qwz.com/xml" elementFormDefault="qualified">
    <!--    xmlns=url  使用默认的名称空间,后面url随便写
     xmlns:xsd=url  可以引入多个xml  schema文档
     targetNamespace  指定schema元素属于哪个命名空间
    -->

    <!-- 根节点名字和包含的内容,内容是自定义studentType -->
    <xsd:element name="students" type="studentsType"/>
    <!-- studentType类型声明   -->
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <!-- students根节点中存放的是student类型  type="studentType" 要求student的个数从0开始 个数不限制 -->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <!-- studentType声明 -->
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <!-- 要求student标签内有name,age,sex子标签,并且要求对一个对应保存的数据类型是type指定 -->
            <xsd:element name="name" type="xsd:string"/>
            <!-- ageType 和 sexType 是自定义数据约束 -->
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <!-- 给予Student标签属性 属性为id,要声明idType, use="required"不可缺少的 -->
        <xsd:attribute name="id" type="idType" use="required"/>
    </xsd:complexType>
    <!-- sexType性别类型声明 -->
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <!-- 有且只有两个数据 male female -->
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <!-- 0 ~ 256 要求范围,是一个integer类型 -->
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="idType">
        <xsd:restriction base="xsd:string">
            <!-- ID类型,要求gp_xxxx(四位数字) -->
            <xsd:pattern value="java_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

在xml文件中

<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns="http://www.qwz.com/xml"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.qwz.com/xml students.xsd">
    <student id="java_0001">
        <name>张三</name>
        <age>21</age>
        <sex>female</sex>
    </student>
    <student id="java_0002">
        <name>李四</name>
        <age>25</age>
        <sex>male</sex>
    </student>
</students>

3.xml解析

java中解析xml四种方案

四种只讲一种。因为这一种在源码有!!!咱们开发中不用去书写解析xml的代码

因为xml保存的是数据,你得把这些数据取出来。这就叫解析

四种:1.DOM解析 2.SAX解析 3.JDOM解析 4.DOM4J解析

只学一种 DOM4J这个,为什么?

以后会学习ssm框架,其中spring里面的底层封装了DOM4J,

开发的话,就用不到dom4j。因为是底层。Hibernate也是dom4j这个xml解析工具

动脑子想一下,咱们框架里面很多的xml文件,如何执行的?靠这个dom4j

把xml文件读取出来,变成一个对象,然后去执行方法就可以了。我现在就是再框架的底层

案例

就解析咱们之前student的一个xml

1.创建一个叫student.xml的文件

2.需要导包,dom4j这种方式进行解析的话,需要导一个包

dom4j-1..16.jar

3.写java代码就行了

<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns="http://www.qwz.com/xml"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.qwz.com/xml students.xsd">
    <student id="java_0001">
        <name>张三</name>
        <age>21</age>
        <sex>female</sex>
    </student>
    <student id="java_0002">
        <name>李四</name>
        <age>25</age>
        <sex>male</sex>
    </student>
</students>
package com.qwzstu.client;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.Iterator;
import java.util.List;

public class Student {
    public static void main(String[] args) throws DocumentException {
        //1.创建一个SAXreader
        SAXReader reader = new SAXReader();
        //2.T通过reader对象去读取book.xml文件
        //返回值是一个document对象
        Document document = reader.read("./src/com/qwzstu/test/student.xml");
        //3.document对象获取根节点元素
        Element rootElement = document.getRootElement();
        //4.获取迭代器对象,目的是想遍历
        Iterator iterator = rootElement.elementIterator();
        //5.遍历迭代器获取根节点的信息
        while (iterator.hasNext()){
            Element student =(Element)iterator.next();
            List<Attribute> attributes = student.attributes();
            for (Attribute attribute : attributes) {
                System.out.println(attribute.getStringValue());
            }
            Iterator iterator1 = student.elementIterator();
            while (iterator1.hasNext()){
                Element stu = (Element)iterator1.next();
                System.out.println(stu.getName()+":"+stu.getStringValue());
            }

        }
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值