Java基础进阶02-xml

目录

一、XML(可拓展标记语言)

1.学习网站:

2.作用

3.XML标签

4.XML语法

5.解析XML

(1)常见解析思想DOM

6.常见的解析工具

7.DOM4j的使用

8.文档约束

(1)概述

(2)分类

(3)DTD约束

(4)引入DTD约束

(5)DTD语法

①定义元素

②定义属性

(6)schema约束

①定义元素

②定义属性

(7)引入schema约束

(8)schema和DTD约束的区别


一、XML(可拓展标记语言)

1.学习网站:

https://www.w3schoo1.com.cn

  • 标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)

  • 可扩展:标签的名字是可以自定义的

2.作用

  • 用于进行存储数据和传输数据

  • 作为软件的配置文件

3.XML标签

  • 标签由一对尖括号和合法标识符组成 < user >

  • 标签必须成对出现< user >< user/>

  • 特殊的标签可以不成对,但是必须有结束标记< user/ >

  • 标签中可以定义属性,属性和标签名空格隔开属性值必须用引号(单/双)引起来< user id = "100"/>

  • 标签需要正确的嵌套

4.XML语法

  • 后缀名为.xml

  • 文档声明必须是第一行第一列

<?xmlversion="1.0”encoding="UTF-8" standalone= “yes”?>
其中
version属性必须存在
encoding属性不是必须的,作用:打开当前xml文件的时候应该是使用什么字符编码表(默认都是UTF-8)
standalone属性不是必须的,作用:描述XML文件是否依赖其他的xml文件,取值为yes/no
  • 必须存在根标签

  • XML文件中可以定义注释信息

  • XML文件中可以存在以下特殊字符

&lt;-----------------小于
&gt;-----------------大于
&amp;----------------和号(&)
&apos;---------------单引号
&quot;---------------引号
  • XML可以存在CDATA区

<![CDATA[ ...内容...]]>

5.解析XML

(1)常见解析思想DOM
  • DOM(DocumentObject Model)文档对象模型:

就是把文档的各个组成部分看做成对应的对象,会把xmI文件全部加载到内存在内存中形成一个树形结构,再获取对应的值

其中DOM对象主要有以下部分

  • Document对象:整个xml文档

  • Element对象:所有标签

  • Attribute对象:所有属性

  • Text对象:所有文本内容

其中Element,Attribute,Text有一个共同的父类:Node对象

6.常见的解析工具

  • JAXP:SUN公司提供的一套XML的解析的API

  • JDOM:开源组织提供了一套XML的解析的API-jdom

  • DOM4J:开源组织提供了一套XML的解析的API-dom4j

  • pull :主要应用在Android手机端解析XML

7.DOM4j的使用

首先下载jar包

xml文件

<?xml version="1.0" encoding="utf-8" ?>
<books>
    <book id="1">
        <name>语文</name>
        <versions>人教版</versions>
    </book>
    <book id="2">
        <name>数学</name>
        <versions>人教版</versions>
    </book>
    <book id="3">
        <name>数学</name>
        <versions>苏教版</versions>
    </book>
    
    <user id="1">
        <name>小明</name>
        <studentID>1235354</studentID>
    </user>
</books>

需求:

  • 解析这个xmI文件

  • 将解析到的Book标签数据封装到Book对象中并将其存储到ArrayList集合中

  • 遍历集合

解析类:

public class Analysis {
​
    public Document parseUrl(String url) throws DocumentException {
        SAXReader reader = new SAXReader();
        return reader.read(url);
    }
    public Document parseUrl(File file) throws DocumentException {
        SAXReader reader = new SAXReader();
        return reader.read(file);
    }
​
}

Book类

public class Book {
    private String name;
    private String version;
    private Long id;
​
    public Book() {
    }
​
    public Book(String name, String version, Long id) {
        this.name = name;
        this.version = version;
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getVersion() {
        return version;
    }
​
    public void setVersion(String version) {
        this.version = version;
    }
​
    public Long getId() {
        return id;
    }
​
    public void setId(Long id) {
        this.id = id;
    }
​
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", version='" + version + '\'' +
                ", id=" + id +
                '}';
    }
}

测试类

public class Application {
    public static void main(String[] args) throws  DocumentException {
​
        File file = new File("reflection\\src\\xml\\bookstores.xml");
        Analysis analysis = new Analysis();
        Document document = analysis.parseUrl(file);
​
        //获取根标签
        Element rootElement = document.getRootElement();
        //通过根标签获取book标签
        //无参elements()获取所有子标签
        List<Element> elements = rootElement.elements();
        System.out.println(elements.size());
        elements.forEach(book -> {
            System.out.println(book.getName());
        });
​
        //有参elements(标签名)可以获取所有的指定子标签
        List<Element> books = rootElement.elements("book");
        System.out.println(books.size());
​
        books.forEach(book -> {
            System.out.println("=====================================");
            //获取属性对应的属性值
            System.out.println(book.attribute("id").getValue());
            //获取该标签下的子标签
            book.elements("name").forEach(name -> {
                //获取标签体的内容
                System.out.println(name.getText());
            });
​
            book.elements("version").forEach(v -> {
                //获取标签体的内容
                System.out.println(v.getText());
            });
        });
        System.out.println("------------------------------------");
​
        //准备封装
        ArrayList<Book> bookArrayList = new ArrayList<>();
        books.forEach(book -> {
            Book book1 = new Book(book.element("name").getText(),
                                    book.element("version").getText(),
                                    Long.valueOf(book.attribute("id").getValue()));
            System.out.println(book1);
            bookArrayList.add(book1);
        });
        //最后检查"
        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
        bookArrayList.forEach(book -> System.out.println(book.toString()));
​
​
​
    }
}

8.文档约束

(1)概述

用来限定xml文件中可使用的标签以及属性

(2)分类
  • DTD

  • schema

(3)DTD约束
  • 创建一个文件,后缀名为.dtd

  • 看xml文件中使用了哪些元素(<!ELEMENT>可以定义元素)

  • 判断元素是简单元素还是复杂元素

    • 简单元素:没有子元素

    • 复杂元素:有子元素的

xml文件:下面的约束文档的xml内容

<?xml version="1.0" encoding="utf-8" ?>
<books>
    <book id="1">
        <name>语文</name>
        <versions>人教版</versions>
    </book>
    <book id="2">
        <name>数学</name>
        <versions>人教版</versions>
    </book>
    <book id="3">
        <name>数学</name>
        <versions>苏教版</versions>
    </book>
</books>

需要掌握:

  • 能在xml文件中引入dtd约束文档

  • 能够简单阅读约束文档

  • 能根据约束文档写xml文件

(4)引入DTD约束

方式一:引入本地dtd

<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 SYSTEM(表示引入本地DTD) ‘DTD文件路径’>-->
<!DOCTYPE books SYSTEM 'restrain.dtd'>

方式二:在xml文件内部引入

<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 [](表示内部引入dtd,[]内写约束内容)>-->
<!DOCTYPE books [] >

方式三:引入网络dtd

<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 PUBLIC(表示引入网络DTD) “dtd文件名” “dtd文档的url”>-->
<!DOCTYPE books PUBLIC “dtd文件名” “dtd文档的url”>

(5)DTD语法
①定义元素
<!ELEMENT元素名 元素类型>
  • 简单元素

    • EMPTY:表示标签体为空

    • ANY:表示标签体可以为空也可以不为空

    • PCDATA:表示该元素的内容部分为字符串

  • 复杂元素

    • 直接写子元素名称。

    • 多个子元素可以使用”,“或者 ”|" 隔开;

      • ” , ":表示定义子元素的顺序

      • ”|”: 表示子元素只能出现任意一个

        • "?“:零次或一次

        • ” + ":一次或多次

        • " * ":零次或多次;

        • 如果不写则表示出现一次

②定义属性
<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
  • 属性的类型

    • CDATA类型:普通的字符串

  • 属性的约束:

    • #REQUIRED:属性是必须的

    • #IMPLIED:属性不是必需的

    • #FIXED value:属性值是固定的value值

DTD约束文件

<!--复杂元素-->
<!ELEMENT books (book+)>
<!ELEMENT book (name,version)>
<!--简单元素-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT version (#PCDATA)>
<!--定义属性-->
<!ATTLIST book id #PCDATA #IMPLIED>

(6)schema约束
①定义元素
  • 创建一个文件,后缀名为.xsd

  • 定义文档声明

  • schema文件的根标签为:< schema>

  • 在< schema>中定义属性:xmIns=XML Schema

  • 在根标签中定义属性:targetNamespace =唯一的url地址,用来指定当前这个schema文件的名称空间

  • 在根标签定义属性:elementFormDefault="qualified,表示当前schema文件是一个质量良好的文件

  • 通过element定义元素

  • 判断当前元素是简单元素还是复杂元素

②定义属性
                属性名      属性类型      属性的约束【required(必须的),optional(可选的)】
<attribute name="id" type="string"use="required"></attribute>

 (7)引入schema约束
  • 在根标签定义属性:xmIns="http://www.w3.org/2001/XMLSchema-instance

  • 通过xmIns引入约束文件的名称空间

  • 给某一个xmins属性添加一个标识,用于区分不同的名称空间,格式为:xmins:标识=“名称空间地址”,标识可以是任意的,但是一般取值都是xsi

  • 通过xsi:schemaLocation指定名称空间所对应的约束文件,路径格式为:父 si:schemaLocation ="名称空间url 文件路径“

<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="www.book_schema.cn"
        xsi:shemaLocation="www.book_shema.cn book_shema.xad"
>

根据上面xml写一个xsd文件

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="www.book_schema.cn"
        elementFormDefault="qualified">
​
<!--    element name = "根标签名"-->
    <element name="books">
<!--        complexType表示当前标签是复杂的元素-->
        <complexType>
            <sequence>
<!--               定义book复杂元素,maxOccurs:该标签最多出现的次数,unbounded是无限制-->
                <element name="book" maxOccurs="unbounded">
                    <complexType>
                        <sequence>
<!--                            定义简单元素-->
                            <element name="name" type="string"/>
                            <element name="version" type="string"/>
                        </sequence>
                        <attribute name="id" type="string" use="required"></attribute>
                    </complexType>
​
                </element>
​
            </sequence>
​
        </complexType>
    </element>
​
</schema>
(8)schema和DTD约束的区别
  • schema约束文件也是一个xml文件,符合xm的语法,这个文件的后缀名.xsd

  • 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)

  • dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型

  • schema语法更加的复杂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/348823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全桥变压器计算1

一共有两级&#xff0c;先DC升压&#xff0c;后H桥逆变为AC 因为两级都有损耗&#xff0c;所以一般用输入功率计算 电池升压到400V高压用的效率用表示&#xff0c;后面DC转AC的效率用表示&#xff0c;输入电压用Vin&#xff0c;输出功率Po2000W,输入功率为Pin 一般和96% 所…

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据

Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言正文 引言 之前在 《pandas向已经拥有数据的Excel文件中添加新数据》 一文中我们介绍了如何通过 pandas 向 Excel 文件中写入数据。那么对于含有多表头的数据&#xff0c;我们该如何将它们…

单调性的应用

1单调性 应用场景&#xff1a;常应用于双指针的进一步优化问题中含义&#xff1a;针对指针 i 1 > i i1>i i1>i一定有 j 1 > j j1>j j1>j或者 j 1 < j j1<j j1<j这样我们就可以利用该性质对算法进行进一步优化&#xff0c;避免一些不必要的遍历…

Linux——系统简介

1、从UNIX到LINUX 在目前主流的服务器端操作系统中&#xff0c;UNIX诞生于20世纪60年代末&#xff0c;Windows诞生于20世纪80年代中期&#xff0c;Linux诞生于20世纪90年代初&#xff0c;可以说UNIX是操作系统中的“老大哥”。 1.1、Linux简史 Linux内核最初是由李纳斯托瓦兹…

Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms

报错 Caused by: com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {typeUNKNOWN, servers[{addressmangodb-m.cc.com:3717, typeUNKNOWN, stateCONNECTING, exception{com.mongodb.MongoSocketReadE…

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题可以理解为&#xff0c;只能保证块内有序的情况下&#xf…

力扣日记1.25-【回溯算法篇】39. 组合总和

力扣日记&#xff1a;【回溯算法篇】39. 组合总和 日期&#xff1a;2023.1.25 参考&#xff1a;代码随想录、力扣 39. 组合总和 题目描述 难度&#xff1a;中等 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和…

【域名解析】如何将域名指向对应服务器IP

目录 &#x1f337;一、域名解析基本概念 &#x1f33c;1. 定义 &#x1f33c;2. 域名解析类型 &#x1f337;二、域名解析服务器IP地址 &#x1f33c;1. 操作步骤 &#x1f33c;2. 验证 &#x1f337;一、域名解析基础知识 &#x1f33c;1. 基本概念 定义&#xff1a; …

微信小程序开发scroll-view在预览或真机调试仅显示第一个元素解决方案

现象如下&#xff1a; 在编译时显示正常&#xff1a; 在预览或真机调试时仅显示第一个元素&#xff1a; 解决方案&#xff1a;将app.json文件中renderer类型由skyline改为webview 更多微信小程序内容欢迎关注我&#xff01; 有帮助的话欢迎打赏&#xff01;

二次开发RuoYi-Vue操作记录

二次开发RuoYi-Vue操作记录 一、本地启动修改1、修改文件路径2、修改redis配置3、数据源配置4、导入sql 二、新增模块1、创建模块2、添加依赖 三、新增页面1、数据准备2、代码生成3、菜单管理&#xff08;1&#xff09;目录创建&#xff08;2&#xff09;菜单创建&#xff08;3…

ESP32开发板可以承受的最大电压

ESP32的最大工作电压为3.3V。但这并不意味着我们不能向 ESP32开发板施加大于 3.3V 的电压。ESP32 具有板载稳压器&#xff0c;使用 VIN 和 GND 引脚可承受最大 15V 的电压。 一旦电压输入到 ESP32 开发板VIN 引脚&#xff0c;该电压就会通过 ESP32 板载稳压器&#xff08;AMS11…

宏景eHR SmsAcceptGSTXServlet XXE漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR SmsAcceptGSTXServlet接口处存在XML实体注入漏洞,未经身份认证的攻击者可以利用此漏洞读取系统内部敏感文件,获取敏…

群辉NAS的远程访问

群辉NAS是私有云存储&#xff0c;局域网访问很容易【详见&#xff1a;网上邻居访问设置、其它设备的访问设置】&#xff0c;远程访问相对复杂&#xff0c;涉及很多关键因素&#xff0c;现将过程记录如下&#xff1a; 目录 1、互联网接入 2、绑定MAC与IP地址 3、路由器开启5…

qml中访问控件内部的子项

如何访问Repeater类型内部的子项、Row等布局类型内部的子项以及ListView内部的子项等。。。 1、测试代码 import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 import QtQuick.Layouts 1.3 import QtQml 2.12Window {id: windowobjectName: "m…

米贸搜|Facebook“精准营销”越来越难?或许是“受众定位”没彻底搞清!

一、为何要确定目标受众 对于每个广告主而言&#xff0c;面向最有可能成为其客户的用户营销非常重要&#xff0c;因此&#xff0c;确定目标受众&#xff0c;是Facebook广告投放中极其重要的一环。 二、什么是目标受众&#xff1f; 目标受众是您希望向其传达营销信息&#xf…

java servlet 高校田径运动会管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp高校田径运动会管理系统是一套完善的java web信息管理系统 采用mvc模式 servletdaobean 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecl…

“JavaScript 循环中的 ‘await‘

目录 前言 for使用await -- 有效的 forEach使用await -- 无效的 for of 使用await 有效的 for await of 使用await 有效的 总结 前言 在JavaScript的forEach方法中使用await是无效的&#xff0c;因为forEach方法不支持异步操作的等待。 forEach是一个数组的遍历方法&…

如何修改hosts文件-mac

1、什么是hosts文件&#xff1f; Hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”&#xff0c;即域名映射到IP地址&#xff0c;域名是为了方便人类记忆识别&#xff0c…

力扣354. 俄罗斯套娃信封问题

动态规划 思路&#xff1a; 同时控制 w、h 两个维度比较复杂&#xff0c;可以先固定一个维度&#xff0c;来找出另外一个维度的严格单调序列&#xff1a; 对 w 排序&#xff0c;然后再来找 h 维度严格单调递增序列长度&#xff1b;在 w 排序时&#xff0c;会遇到 w(i) w(j) 的…

VS2022联合Qt5开发学习11(QT5.12.3联合VTK在VS2022上开发医学图像项目5——qvtkWidget上显示STL三维图像并取点)

这篇博文是接着这个系列前面的博文&#xff0c;来讲如何实现医学图像三视图同步视图。我想到的一个思路是用Scrollbar来控制切面的改变&#xff0c;还有一个想法是在三维图像上取点&#xff0c;然后以这个点为切面中心更新三维视图。这篇博文主要介绍的就是第二个想法的三维图像…