XML的基础


一、XML是什么?

XML 指可扩展标记语言

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

在我们的 XML 教程中,你将了解什么是 XML,以及 XML 与 HTML 之间的差异。

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

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

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

xml就是用来存储数据的

html w3c组织定义好的标签

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

二、自己写一个XML文件

在这里插入图片描述

代码如下(示例):

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
	<book category="science">
		<title lang="jpm">大力出奇迹</title>
		<author>张三</author>
		<year>2021</year>
		<price>13.574</price>
	</book>
	<book category="文学">
		<title lang="jpm">三国</title>
		<author>罗贯中</author>
		<year>2021</year>
		<price>25.36</price>
	</book>
	<!-- 例子中的根元素是<bookstore>.只能有一个根元素.文档中的所有<book> 元素都被包含在<bookstore>中
	 <book>元素有4个子元素:<title>.<author>.<year>.<price>
	 -->
</bookstore>
<?xml version="1.0" encoding="utf-8"?>
<!-- xml文件的声明
	告诉解析器当前版本是1.0的版本
	编译器是utf-8
	[注意事项]:
		1.只能有一个根元素
		2.标签必须是成双成对的
		3.一定要见名知意
-->
<students>
	<student>
		<name>张三</name>
		<age>68</age>
		<gender></gender>
	</student>
	<student>
		<name>李四</name>
		<age>25</age>
		<gender></gender>
	</student>
</students>

三、XML文件约束

1.DTD约束:
文档类型定义(DTD)可定义合法的XML文件构建模块。就意味着你不能随便写标签了
2.Schema约束:
XML-Schema是基于XML的DTD替代者
XML-Schema描述XML文档的结构
XML-Schema语言也称作XML-Schema定义(XML Schema Definition,XSD)

3.1DTD约束

代码如下(示例):

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 #REQUIRED>
<!--以后记住不用写!!!都是别人封装好的!!你只需要把人家写好的DTD
引入到你的XML文件中使用即可!!你没有这个能力写dtd文件
ssm都是封装好的。目的
使程序统一化-->

xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<!--如果没有引入dtd文件随便写都不会报错!!!-->
<!--但是引入了dtd文件以后只能按照别人约束好的来写-->
<!--引入我们刚才写好的dtd文件-->
<!--<!DOCTYPE 根元素 SYSTEM "文件名"-->
<!--文件名是一个绝对路径-->
<!DOCTYPE students SYSTEM "E:\IdeaProjects\day33_xkh\src\com\qfedu\dtd\student.dtd">
<!--写完约束dtd约束以后,不能再随便写标签了-->
<students>
    <student id="java_01">
        <name>张三</name>
        <age>25</age>
        <sex>1</sex>
    </student>
</students>

3.2Schema约束

是DTD的一个替代品,约束的更加严格
1.新建一个xsd文件

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.qfedu.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.qfedu.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>

2.XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<!--填写根节点的约束关系   schema约束,外部的xsd文件约束进来-->
<students xmlns="http://www.qfedu.com/xml"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.qfedu.com/xml student.xsd">
    <!--以上的内容是不是需要自己写??你是不是要疯?记住以后都是黏贴复制
    不可能让你写的,你再牛逼也不行的
    -->
    <student id="java_0001">
        <name>骚磊</name>
        <age>120</age>
        <sex>female</sex>
    </student>
</students>

四、XML解析

java中解析xml四种方案
四种只讲一种。因为这一种在源码有!!!咱们开发中不用去书写解析xml的代码
因为xml保存的是数据,你得把这些数据取出来。这就叫解析
四种:1.DOM解析 2.SAX解析 3.JDOM解析 4.DOM4J解析
只学一种 DOM4J这个,为什么?
以后会学习ssm框架,其中spring里面的底层封装了DOM4J,讲这个不是为了开发
开发的话,就用不到dom4j。因为是底层。我讲这个的目的是为了以后读懂spring
框架的源码。Hibernate也是dom4j这个xml解析工具
动脑子想一下,咱们框架里面很多的xml文件,如何执行的?靠这个dom4j
把xml文件读取出来,变成一个对象,然后去执行方法就可以了。我现在就是再框架的底层

案例:
就解析咱们之前bookstore的一个xml

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

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book category="science">
        <title lang="jpm">金瓶梅</title>
        <author>老邢</author>
        <year>2021</year>
        <price>13.38</price>
    </book>

    <book category="文学">
        <title lang="jpm">三国</title>
        <author>骚磊</author>
        <year>2020</year>
        <price>10.22</price>
    </book>
    <!-- 例子中的根元素是 <bookstore>。只能有一个根。文档中的所有 <book> 元素都被包含在 <bookstore> 中。

<book> 元素有 4 个子元素:<title>、< author>、<year>、<price> -->
</bookstore>

2.需要导包,dom4j这种方式进行解析的话,需要导一个包
dom4j-1.6.1.jar
在这里插入图片描述

3.写java代码就行了

package com.qfedu.parsexml;

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

import java.io.File;
import java.util.Iterator;
import java.util.List;

public class Demo1 {
    public static void main(String[] args) throws DocumentException {
        //1.创建一个SAXreader
        SAXReader reader = new SAXReader();
        //2.T通过reader对象去读取book.xml文件
        //返回值是一个document对象
        Document document = reader.read(new File("src/xml/book.xml"));
        //3.document对象获取根节点元素
        Element bookstore = document.getRootElement();
        //4.获取迭代器对象,目的是想遍历
        Iterator iterator = bookstore.elementIterator();
        //5.遍历迭代器获取根节点的信息
        while (iterator.hasNext()){
            System.out.println("开始遍历一本书");
            Element book = (Element)iterator.next();
            //获取book的属性及属性值
            List<Attribute> attributes = book.attributes();
            for (Attribute attribute : attributes) {
                System.out.println("属性:" + attribute.getName() + ": "+attribute.getValue());
            }
            Iterator itt = book.elementIterator();
            while(itt.hasNext()){
                Element bookChild = (Element) itt.next();//获取book子标签对象
                System.out.println("节点名:" + bookChild.getName()+ "----节点值:" + bookChild.getStringValue());
            }
            System.out.println("结束遍历一本书");
        }
    }
}

结果如下(示例):
在这里插入图片描述

总结

提示:这里对文章进行总结:没有总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小yu别错过

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

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

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

打赏作者

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

抵扣说明:

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

余额充值