Java & XML(初学者)

1 篇文章 0 订阅

XML简述

它是一种文件格式。我们之前学的HTML其实是XML的子集。

HTML中只是W3C规定了一系列的 标签 和 属性 ,使得他们具备特定的意义。

而广义上的XML 是支持任意的 标签 和 属性(我们自己可以定义),这样的话就可以描述特定的业务领域。

所以,从技术上讲,往往也会使用XML的格式来作为:

  • 数据传输的格式
  • 可以做为软件的配置文件

组成

头部声明

<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.0" encoding="UTF-8" ?>

必须写在xml文件的顶头的位置,是一种特殊的声明。

元素(内容)

  • 我要描述一个学生(姓名和年龄)
<!--通过子标签的形式来描述-->
<student>
    <name>张三</name>
    <age>20</age>
</student>`
<!-- 通过属性的方式来描述-->
<student name="张三" age="20"/>
  • 我要描述一群学生
<!--标签具备业务含义-->
<students>
    <student name="张三" age="20"/>
    <student name="张三" age="20"/>
    <student name="张三" age="20"/>
</students>
  • 对于一个规范的XML文件来说,最好只包含唯一的一个根元素。

XML文件的约束

用来约束我们的XML的内容需要符合一定的业务规则。从技术上讲,有两种约束的方式。一种是DTD约束文件的方式,一种是Schema约束文件的方式。

  • DTD相对简单,描述能力差一些。典型的代表: MyBatis
  • Schema相对复杂,描述能力强一些。典型的代表:JavaWeb约束、 Spring

DTD约束的方式

  • 文件名以 .dtd 结尾
  • 它本身也是一个 xml 文件
  • 它里面定义了一些特殊的标签
//定义了一个web-app的标签
//且规范了它的子标签(顺序和个数)
// 可以出现0个或多个 servlet 子标签 
// 紧接着:0个或多个 servlet-mapping 子标签
// 紧接着:0个或1个 welcome-file-list 子标签 
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >

//定义servlet标签的规则
// 必须出现 servlet-name 子标签
// 0个或1个 description 子标签
// 必须出现 servlet-class 或者 jsp-file 子标签 (二选一)
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>


//定义servlet-mapping标签的规则
// 必须出现servlet-name子标签
// 必须出现 1个或多个 url-pattern 子标签
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >

//定义servlet-name 标签的规则
// #PCDATA 表示内容是文本内容。
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>

<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>

//定义 web-app 标签的属性列表的规则
// version 属性名 CDATA 是值的类型 #IMPLIED 表示可以有也可以没有
<!ATTLIST web-app version CDATA #IMPLIED>

Schema约束的方式

  • 文件的后缀名是 .xsd
  • 它也是一种特殊的 xml 文件

在这里插入图片描述

XML的解析

从技术流派上讲,XML解析也分为:

DOM

  • 跟HTML类似,是整个将XML文件加载到内容中,然后映射为Java对象,进行解析。
  • 弊端: 不适合处理大型的XML文件。
  • 优势:保留了节点的信息,方便操作。

SAX

  • 不是完整的加载整个XML文件,而是一边读,一边解析。
  • 优势: 可以处理大型的XML文件
  • 弊端: 它由于读取完成以后就丢弃信息,所以,无法操作XML文档,只能读取。

市面上能够解析XML的库也有很多,包括Java语言自己的。(自己了解一下)。

其中,最常见的是名为 dom4j 的一个库。

官网: https://dom4j.github.io/在这里插入图片描述

package com.example.xml.parse;

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

import java.net.URL;
import java.util.Iterator;

/*
    读取XML文档的案例

    //1. 根据一个xml文档的 URL地址,解析出一个Document对象

    //2. 根据document对象的 getRootElement() 方法可以返回文档的根节点

    //3. 根据Element对象的
        elementIterator() 可以返回所有的子元素(迭代器)
        elements() 返回子元素列表
        element("name") 返回指定名称的唯一的子元素
        elementIterator("foo")  返回所有自定标签名的子元素(迭代器)
        elements("student") 返回指定名称的子元素列表
        attributeIterator();  返回元素的所有属性(迭代器)


        getName方法返回标签的名字
        attribute("name") 返回指定名称的属性 Attribute。
            Attribute对象有
                    getValue
                    getStringValue 返回对应的属性值

 */
public class DemoRead {

    public static void main(String[] args) throws DocumentException {
        //如何获取URL地址呢?
        URL url = DemoRead.class.getResource("students.xml");
        SAXReader reader = new SAXReader();
        Document document = reader.read(url);

        //返回根节点 <students>
        Element students = document.getRootElement();

//        students.elements("student");


        Iterator iterator = students.elementIterator("student");
        while(iterator.hasNext()){
            Element student = (Element) iterator.next();
            //拿到每一个Student标签,我需要访问它的 name 属性
            String name = student.attribute("name").getStringValue();

            //获取Student的age子标签
            Element age = student.element("age");
            //如何获取 <age> 标签内部的文本呢?
            String ageText = age.getTextTrim();

            System.out.println(name+","+ageText);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值