Java Web(六)--XML

news2024/10/7 8:21:14

介绍

官网:XML 教程

为什么需要:

  • 需求 1 : 两个程序间进行数据通信?
  • 需求 2 :  给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码。
  • spring 中的 ico 配置文件,beans.xml 、mybatis XXXMapper.xml  、 tomcat server.xml web.xml  、maven pom.xml
  • 能存储复杂的数据关系

解决问题:

  • 1)解决程序间数据传输的问题:=> json
    •     比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
  • 2)xml 可以做配置文件
    •     xml 文件做配置文件可以说非常的普遍
    •     比如我们的 tomcat 服务器的server.xml ,web.xml
  • 3)xml 可以充当小型的数据库
    •     程序自己的数据格式存放
    •     直接读取文件显然要比读取数据库快
    •     程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作)

xml

创建

    File -> New ->Project ->java ->New Project ->New ->File ->文件名.xml    


组成

1、文档声明

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

    说明

  •         1、XML 声明放在 XML 文档的第一行
  •         2、XML 声明由以下几个部分组成:
  •             version - -文档符合XML1.0 规范,我们学习 1.0
  •             encoding - -文档字符编码,比如"utf-8"

2、元素

    语法:        每个XML文档必须有且只有一个根元素。

        根元素

  •             是一个完全包括文档中其他所有元素的元素
  •             起始标记要放在所有其他元素的起始标记之前
  •             结束标记要放在所有其他元素的结束标记之后

        XML 元素/标签/节点

  •             指XML 文件中出现的标签
  •             一个标签分为开始标签和结束标签
  •             一个标签中也可以嵌套若干子标签。
  •             但所有标签必须合理的嵌套,绝对不允许交叉嵌

    书写形式

  •         包含标签体:<a>www.sohu.cn</a>
  •         不含标签体的:<a></a>, 简写为:<a/>

    命名规则

  •         区分大小写;例如,<P>和<p>是两个不同的标记
  •         不能以数字开头。
  •         不能包含空格。
  •         名称中间不能包含冒号(:)
  •         如果标签单词需要间隔,建议使用下划线;   比如 <book_title>hello</book_title>

3、属性

    基本格式:        <元素名 属性名="属性值">

    说明

  •         属性值用双引号(")或单引号(')分隔;如果属性值中有',用"分隔;有",用'分隔。
  •         一个元素可以有多个属性。
  •         特定的属性名称在同一个元素标记中只能出现一次。
  •         属性值不能包括&  字符。
<Student ID="100">

<Name>TOM</Name>

</Student>

4、注释

 语法格式:    <!--这是一个注释- ->

    说明

  •         注释内容中不要出现- -;
  •         不要把注释放在标记中间;错误写法 <Name <!--the name-->>TOM</Name>。
  •         注释不能嵌套;
  •         可以在除标记以外的任何地方放注释

5、CDATA 区 、特殊字符

  语法

        <![CDATA[

        这里可以把你输入的字符原样显示,不会解析 xml

        ]]>

说明:

  •         可以输入任意字符(除]]>外)
  •         不能嵌套
  •         有些内容不想让解析引擎执行, 而是当作原始内容处理(即当做普通文本), 可以使用 CDATA 包括起来, CDATA 节中的所有字符都会被当作简单文本, 而不是 XML 标记

实例1:

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

<students> 
  <student id="01"> 
    <name>小龙女</name>  
    <gender>女</gender>  
    <age>19</age>  
    <resume>古墓派掌门人</resume> 
  </student>  
  <student id="02"> 
    <name>欧阳锋</name>  
    <gender>男</gender>  
    <age>21</age>  
    <resume>白驼山,蛤蟆神功</resume> 
  </student> 
</students>

DOM4j

介绍

官网:dom4j 1.6.1 API

一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。

使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性

一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。

使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件。

注意:xml常用来查询(遍历和指定查询),删改使用少,作为扩展。


获取document对象的3种方式

    1、读取 XML 文件,获得 document 对象

 //创建一个解析器

SAXReader reader = new SAXReader();    

//XML Document

Document    document = reader.read(new File("src/input.xml")); 

    2、解析 XML 形式的文本,得到 document 对象.

String text = "<members></members>";

Document document = DocumentHelper.parseText(text);

    3、主动创建document 对象.

//创建根节点 

Document document = DocumentHelper.createDocument();

Element root = document.addElement("members");


 常用API

    attributes  返回该元素的属性列表

    attributeValue  根据传入的属性名获取属性值

    elementIterator  返回包含子元素的迭代器

    elements  返回包含子元素的列表

应用实例

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

<students>
    <student id="01">
        <name>小龙女</name>
        <gender>女</gender>
        <age>19</age>
        <resume>古墓派掌门人</resume>
    </student>
    <student id="02">
        <name>欧阳锋</name>
        <gender>男</gender>
        <age>21</age>
        <resume>白驼山,蛤蟆神功</resume>
    </student>
</students>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.testng.annotations.Test;

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

public class Dom4j_ {

/**
 * 演示如何加载xml文件
 */
@Test
public void loadXML() throws DocumentException {
	// 得到一个解析器
	SAXReader reader = new SAXReader();
	Document document = reader.read(new File("src/students.xml"));
	System.out.println(document); // org.dom4j.tree.DefaultDocument@887af79

}

/**
 * 遍历所有的student信息
 */
@Test
public void listStus() throws DocumentException {
	// 得到一个解析器
	SAXReader reader = new SAXReader();
	Document document = reader.read(new File("src/students.xml"));

	// 1. 得到rootElement, 你是OOP
	Element rootElement = document.getRootElement();

	// 2. 得到rootElement的student Elements
	List<Element> students = rootElement.elements("student");
	// System.out.println(student.size());//2
	for (Element student : students) {// element就是Student元素/节点
		// 获取Student元素 的name Element
		Element name = student.element("name");
		Element age = student.element("age");
		Element resume = student.element("resume");
		Element gender = student.element("gender");

		System.out.println("学生信息= " + name.getText() + " " + age.getText() +
				" " + resume.getText() + " " + gender.getText());
	}

}

/**
 * 指定读取第一个学生的信息 就是 dom4j+xpath
 */
@Test
public void readOne() throws DocumentException {

	// 得到一个解析器
	SAXReader reader = new SAXReader();
	Document document = reader.read(new File("src/students.xml"));

	// 1. 得到rootElement, 你是OOP
	Element rootElement = document.getRootElement();

	// 2. 获取第一个学生
	Element student = (Element) rootElement.elements("student").get(1);

	// 3. 输出该信息
	System.out.println("该学生的信息= " + student.element("name").getText() + " " +
			student.element("age").getText() + " " + student.element("resume").getText() +
			student.element("gender").getText());

	// 4. 获取student元素的属性
	System.out.println("id= " + student.attributeValue("id"));
}

/**
 * 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
 *
 * @throws Exception
 */
@Test
public void add() throws Exception {

	// 1.得到解析器
	SAXReader saxReader = new SAXReader();
	// 2.指定解析哪个xml文件
	Document document = saxReader.read(new File("src/students.xml"));

	// 首先我们来创建一个学生节点对象
	Element newStu = DocumentHelper.createElement("student");
	Element newStu_name = DocumentHelper.createElement("name");

	// 如何给元素添加属性
	newStu.addAttribute("id", "04");
	newStu_name.setText("宋江");

	// 创建age元素
	Element newStu_age = DocumentHelper.createElement("age");
	newStu_age.setText("23");

	// 创建resume元素
	Element newStu_intro = DocumentHelper.createElement("resume");
	newStu_intro.setText("梁山老大");

	// 把三个子元素(节点)加到 newStu下
	newStu.add(newStu_name);
	newStu.add(newStu_age);
	newStu.add(newStu_intro);

	// 再把newStu节点加到根元素
	document.getRootElement().add(newStu);

	// 直接输出会出现中文乱码:
	OutputFormat output = OutputFormat.createPrettyPrint();
	output.setEncoding("utf-8");// 输出的编码utf-8

	// 把我们的xml文件更新
	// lets write to a file
	// new FileOutputStream(new File("src/myClass.xml"))

	// 使用到io编程 FileOutputStream 就是文件字节输出流
	XMLWriter writer = new XMLWriter(
			new FileOutputStream(new File("src/students.xml")), output);
	writer.write(document);
	writer.close();

}

/**
 * //删除元素(要求:删除第一个学生) 使用少,了解
 *
 * @throws Exception
 */
@Test
public void del() throws Exception {
	// 1.得到解析器
	SAXReader saxReader = new SAXReader();

	// 2.指定解析哪个xml文件
	Document document = saxReader.read(new File("src/students.xml"));

	// 找到该元素第一个学生
	Element stu = (Element) document.getRootElement().elements("student").get(2);

	// 删除元素
	stu.getParent().remove(stu);

//        //删除元素的某个属性
//        stu.remove(stu.attribute("id"));

	// 更新xml
	// 直接输出会出现中文乱码:
	OutputFormat output = OutputFormat.createPrettyPrint();
	output.setEncoding("utf-8");// 输出的编码utf-8

	// 把我们的xml文件更新
	XMLWriter writer = new XMLWriter(
			new FileOutputStream(new File("src/students.xml")), output);
	writer.write(document);
	writer.close();
	System.out.println("删除成功~");
}


/**
 * //更新元素(要求把所有学生的年龄+3) 使用少,了解
 *
 * @throws Exception
 */
@Test
public void update() throws Exception {

	// 1.得到解析器
	SAXReader saxReader = new SAXReader();

	// 2.指定解析哪个xml文件
	Document document = saxReader.read(new File("src/students.xml"));

	// 得到所有学生的年龄
	List<Element> students = document.getRootElement().elements("student");

	// 遍历, 所有的学生元素的age+3
	for (Element student : students) {
		// 取出年龄
		Element age = student.element("age");
		age.setText((Integer.parseInt(age.getText()) + 3) + "");
	}

	// 更新
	// 直接输出会出现中文乱码:
	OutputFormat output = OutputFormat.createPrettyPrint();
	output.setEncoding("utf-8");// 输出的编码utf-8

	// 把我们的xml文件更新
	XMLWriter writer = new XMLWriter(
			new FileOutputStream(new File("src/students.xml")), output);
	writer.write(document);
	writer.close();
	System.out.println("更新成功~");
}
}

其他

xml解析技术

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git使用过的命令记录

目录 git add .git commit --amendgit push -f origin HEAD:mastergit checkout .git stash想把某个pr的修改应用到本地git 撤销&#xff0c;放弃本地修改参考文档 git add . 将本地修改提交到暂存区 git commit --amend 将修改的东西 追加到上一个pr git push -f origin H…

SQL数据库基础语法-查询语句

SQL数据库基础语法-查询语句 Group By #对数据进行分组 >select name,count(id) from student group by name; #查询name字段人数&#xff0c;cont函数进行计数 >select * from users group by users; >select * from users where id1 group by 2; >select * from …

线阵相机参数介绍之轴编码器控制

1.1 功能介绍 编码器是将检测对象的运动与相机拍摄取图相匹配的设备&#xff0c;也即检测对象运动一定距离&#xff0c;相机就拍摄一定行高的图像。 编码器会将检测对象的实际位移转换为固定数量电信号。例如&#xff1a;编码器的精度是2000p/r,该参数的含义是编码器每转一圈输…

webpack打包速度优化思维导图

webpack打包速度优化思维导图 前言附件 前言 去年的时候公司一个项目体积过大&#xff0c;我是m1芯片的macpro&#xff0c;光启动就要1分钟&#xff0c;配置差点都电脑&#xff0c;启动就要3分钟&#xff0c;自然打包速度也会慢很多&#xff0c;我们是gitlab设置成了自动打包的…

数据分析 — 电商用户分析和用户 RFM 模型

目录 一、电商用户分析1、数据字段信息2、数据读取3、数据清洗4、可视化分析1、每年销售额的增长情况2、各个地区分店的销售额3、每个分店每一年的销售额4、销售淡旺季5、新增用户 二、RFM 模型1、RFM 模型的三个维度2、RFM 的客户类型标签3、RFM 模型的二分法思想4、代码 一、…

【算法】动态规划1,最小花费爬楼梯,解码方法

一、动态规划简介 动态规划 , 英文名称 Dynamic Programming , 简称 DP , 不是具体的某种算法 , 是一种算法思想 ; 动态规划 , 没有具体的步骤 , 只有一个核心思想 ; 动态规划 的 核心思想 是 由大化小 , 大规模问题 使用 小规模问题 计算结果 解决 , 类似于 分治算法 ; 二、…

ipad作为扩展屏的最简单方式(仅需在同一局域网下,无需数据线)

ipad和win都下载安装toDesk&#xff0c;并且都处于同一局域网下 连接ipad&#xff0c;在ipad中输入win设备的设备密码和临时密码&#xff0c;连接上后可以看到ipad会是win屏幕的镜像&#xff0c;此时退出连接&#xff0c;准备以扩展模式再次连接。 注意&#xff0c;如果直接从…

SOPHON算能科技新版SDK环境配置以及C++ demo使用过程

目录 1 SDK大包下载 2 获取SDK中的库文件和头文件 2.1 注意事项 2.2 交叉编译环境搭建 2.2.1 首先安装工具链 2.2.2 解压sophon-img包里的libsophon_soc__aarch64.tar.gz&#xff0c;将lib和include的所有内容拷贝到soc-sdk文件夹 2.2.3 解压sophon-mw包里的sophon-mw-s…

pyqt如何实现拖拽打开文件(通过windows的快捷方式打开文件)

桌面端的开发中如何通过windows的快捷方式打开文件&#xff0c;那么如何将需要打开的数据传递给qt程序呢&#xff1f; 研究了一下发现很简单 通过sys.argv可以轻松的实现传参 sys.argv import sys print(sys.argv)这个方法可以获取系统传递给程序的参数&#xff0c;默认是个列…

Android 12.0 systemui锁屏页面时钟显示样式的定制功能实现

1.前言 在12.0的系统ROM定制化开发中,在进行systemui的相关开发中,当开机完成后在锁屏页面就会显示时间日期的功能,由于 开发产品的需求要求时间显示周几上午下午接下来就需要对锁屏显示时间日期的相关布局进行分析,然后实现相关功能 效果图如图: 2.systemui锁屏页面时钟显…

Linux搭建JavaEE环境

Linux搭建JavaEE环境 需要在 Linux 下进行 JavaEE 的开发&#xff0c;我们需要安装如下软件 JDKtomcatmysqlidea 安装JDK 安装步骤 首先去官网下载jdk的linux版本 下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 1) mkdir /opt/jdk 2) 通过 …

视频推拉流EasyDSS视频直播点播平台授权出现激活码无效并报错400是什么原因?

视频推拉流EasyDSS视频直播点播平台集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景上&#xff0c;平台可以运用在互联网教育、在线课堂、游戏…

向导式堆栈管理器Dockge

经过申诉&#xff0c;目前博客的几个域名都恢复了&#xff0c;时间也延长到了 2033 年&#xff0c;后面还会不会出问题&#xff0c;老苏就不知道了 什么是 Dockge ? Dockge 是一款时髦的、易于使用的、响应式的、自托管的 docker-compose.yaml 向导式堆栈管理器&#xff0c;可…

flink反压

flink反压&#xff08;backpressure&#xff09;&#xff0c;简单来说就是当接收方的接收速率低于发送方的发送速率&#xff0c;这时如果不做处理就会导致接收方的数据积压越来越多直到内存溢出&#xff0c;所以此时需要一个机制来根据接收方的状态反过来限制发送方的发送速率&…

10、内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 背景&#xff1a; 主要针对内网主机中的 域控提权漏洞&#xff0c;包含漏洞探针和漏洞复现利用。 1、横向移动-系统漏洞-CVE-2017-0146&#xff08;ms17-010&#xff0c;永恒之蓝&#xff0…

ts环境下如何解决第三方npm包类型报错的问题

在 TypeScript 环境下&#xff0c;当引入第三方 npm 包时出现类型报错的问题&#xff0c;可以尝试以下几种解决方法&#xff1a; 1、安装 types 包&#xff1a;许多流行的第三方 npm 包都有对应的 TypeScript 类型声明文件&#xff0c;这些声明文件通常以 types/包名 的形式发…

odoo16-API(Controller)带有验证访问的接口

odoo16-API&#xff08;Controller&#xff09;带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…

蓝桥杯:C++素数、进制转换

素数 定义&#xff1a; 质数又称素数。一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff09;。 代码&#xff1a; #include<bits/stdc.h> using n…

【flutter】环境安装

安装flutter sdk 下载sdk flutter sdk就包含dart&#xff0c;所以我们只用安装flutter sdk就可以了。 我们去清华大学开源软件镜像站下载&#xff0c;flutter开发中&#xff0c;版本对不上基本项目就跑步起来&#xff0c;如果是团队协同开发的话&#xff0c;建议统一下载指定版…

ubuntu22.04@Jetson OpenCV安装

ubuntu22.04Jetson OpenCV安装 1. 源由2. 分析3. 证实3.1 jtop安装3.2 jtop指令3.3 GPU支持情况 4. 安装OpenCV4.1 修改内容4.2 Python2环境【不需要】4.3 ubuntu22.04环境4.4 国内/本地环境问题4.5 cudnn版本问题 5. 总结6. 参考资料 1. 源由 昨天用Jetson跑demo程序发现帧率…