【XML】

XML基本介绍

  • XML即可扩展标记语言(Extensible Markup Language)
  • W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。
  • 可扩展的, 标签都是自定义的
  • 语法十分严格

XML的作用

功能说明
存储数据通常,我们在数据库中存储数据。不过,如果希望数据的可移植性更强,我们可以把数据存储 XML 文件中
配置文件作为各种技术框架的配置文件使用 (最多)
在网络中传输客户端可以使用XML格式向服务器端发送数据,服务器接收到xml格式数据,进行解析

XML的语法

  • 文档声明必须为结束;
  • 文档声明必写在第一行;
  1. 语法格式:
<?xml version="1.0" encoding="UTF-8"?>
  1. 属性说明:
    versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
    encoding:指定当前文档的编码。可选属性,默认值是utf-8;

元素

Element 元素: 是XML文档中最重要的组成部分
元素的命名规则

  1. 不能使用空格,不能使用冒号
  2. xml 标签名称区分大小写
  3. XML 必须有且只有一个根元素

语法格式:<users></users>

  1. XML 必须有且只有一个根元素,它是所有其他元素的父元素
<?xml version="1.0" encoding="utf-8" ?> 
<users> 

</users>
  1. 普通元素的结构开始标签、元素体、结束标签组成。
<hello> 大家好 </hello>
  1. 元素体:元素体可以是元素,也可以是文本
<hello> 
	<a>你好</a> 
</hello>
  1. 空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合
<close/>

属性

<bean id="" class=""> </bean>
  1. 属性是元素的一部分,它必须出现在元素的开始标签中
  2. 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
  3. 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
  4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头

注释

XML的注释,<!-- 注释的内容 -->。注释内容会被XML解析器忽略

使用XML 描述数据表中的数据

在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<employees>
    <employee eid="2">
        <ename>林黛玉</ename>
        <age>20</age>
        <sex></sex>
        <salary>5000</salary>
        <empdate>2019-03-14</empdate>
    </employee>

    <employee eid="3">
        <ename>杜甫</ename>
        <age>40</age>
        <sex></sex>
        <salary>6000</salary>
        <empdate>2020-03-14</empdate>
    </employee>
</employees>

XML约束

  • 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
  • 常见的xml约束:
    1、DTD
    2、Schema
  • 作为程序员只要掌握两点
    1、会阅读
    2、会引入
    3、不用自己编写

XML 解析

当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用Java基础所学习的IO知
识是可以完成的,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。
人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML。

XML解析方式

开发中比较常见的解析方式有两种,如下:
DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
缺点:XML文档过大,可能出现内存溢出显现。
SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
优点:占用内存少 处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源。

XML常见的解析器

解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包

  • JAXP:sun公司提供的解析器,支持DOM和SAX两种思想
  • DOM4J:一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
  • Jsoup:jsoup 是一款Java 的HTML解析器 ,也可以解析XML
  • PULL:Android内置的XML解析方式,类似SAX。

dom4j 的使用

在这里插入图片描述

API介绍
  • 使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素,然后就可以操作了
  • 常用API如下:
  • SaxReader对象
    read(…) 加载执行xml文档
  • Document对象
    getRootElement() 获得根元素
  • Element对象
    elements(…) 获得指定名称的所有子元素。可以不指定名称
    element(…) 获得指定名称的第一个子元素。可以不指定名称
    getName() 获得当前元素的元素名
    attributeValue(…) 获得指定属性名的属性值
    elementText(…) 获得指定名称子元素的文本值
    getText() 获得当前元素的文本内容

约束:

<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="http://www.lagou.com/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.lagou.com/xml"
            elementFormDefault="qualified">
    <xsd:element name="users" type="usersType"/>
    <xsd:complexType name="usersType">
        <xsd:sequence>
            <xsd:element name="user" type="userType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="userType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType"/>
            <xsd:element name="hobby" type="hobbyType"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="100"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="hobbyType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="抽烟"/>
            <xsd:enumeration value="喝酒"/>
            <xsd:enumeration value="烫头"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\d{3}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

xml:

<?xml version="1.0" encoding="UTF-8" ?>
<users xmlns="http://www.lagou.com/xml"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.lagou.com/xml user.xsd" >

    <user id="001">
        <name>张三</name>
        <age>20</age>
        <hobby>抽烟</hobby>
    </user>

    <user id="002">
        <name>李四</name>
        <age>22</age>
        <hobby>喝酒</hobby>
    </user>

    <user id="003">
        <name>王五</name>
        <age>24</age>
        <hobby>烫头</hobby>
    </user>

</users>

Java:

public class TestDOM4j {
    public static void main(String[] args) throws DocumentException {
        // 1.创建SAXReader对象
        SAXReader saxReader = new SAXReader();
        // 2.解析XML,获取文档对象Document
        Document read = saxReader.read("F:\\lagouProjects\\2_3\\src\\com\\lagou\\xml\\user.xml");
        // 3.获取根元素
        Element rootElement = read.getRootElement();
        // 获取根元素名称
        System.out.println(rootElement.getName());
        // 获取根元素下的所有标签
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            System.out.println("根元素下的子节点名称:" + element.getName());
            System.out.println("user标签的属性值:" + element.attributeValue("id"));
            System.out.println("user标签的属性名:" + element.attribute("id").getName());
            // 获取子节点下的标签
            List<Element> subElements = element.elements();
            for (Element subElement : subElements) {
                System.out.println("user标签下的子节点名称:" + subElement.getName());
                System.out.println("当前元素的文本内容:" + subElement.getText());
            }
            break;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值