Java Web(六)--XML

介绍

官网: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解析技术

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

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

相关文章

箱形理论在交易策略中的实战应用与优化

箱形理论&#xff0c;简单来说&#xff0c;就是将价格波动分成一段一段的方框&#xff0c;研究这些方框的高点和低点&#xff0c;来推测价格的趋势。 在上升行情中&#xff0c;价格每突破新高价后&#xff0c;由于群众惧高心理&#xff0c;可能会回跌一段&#xff0c;然后再上升…

2024年了,如何从 0 搭建一个 Electron 应用

简介 Electron 是一个开源的跨平台桌面应用程序开发框架&#xff0c;它允许开发者使用 Web 技术&#xff08;如 JavaScript、HTML 和 CSS&#xff09;来构建桌面应用程序。Electron 嵌入了 Chromium&#xff08;一个开源的 Web 浏览器引擎&#xff09;和 Node.js&#xff08;一…

最新Unity游戏主程进阶学习大纲(2个月)

过完年了&#xff0c;很多同学开始重新规划自己的职业方向,找更好的机会,准备升职或加薪。今天给那些工作了1~5年的开发者梳理”游戏开发客户端主程”的学习大纲&#xff0c;帮助大家做好面试准备。适合Unity客户端开发者。进阶主程其实就是从固定的几个方面搭建好完整的知识体…

【Spring】IoC容器 控制反转 与 DI依赖注入 XML实现版本 第二期

文章目录 基于 XML 配置方式组件管理前置 准备项目一、 组件&#xff08;Bean&#xff09;信息声明配置&#xff08;IoC&#xff09;&#xff1a;1.1 基于无参构造1.2 基于静态 工厂方法实例化1.3 基于非静态 工厂方法实例化 二、 组件&#xff08;Bean&#xff09;依赖注入配置…

Docker vs VM

关于应用程序的托管和开发&#xff0c;市场中的技术和产品琳琅满目。对比 Docker 和 VM&#xff0c;如何取舍&#xff1f;这主要由自身团队的因素决定&#xff0c;在选择 Docker 的情况下&#xff0c;你需要保证程序可在容器和虚拟机中运行。另外&#xff0c;成本和易用性也是重…

前端跨域问题解决,本地代理到域名

1.学习黑马uniapp时遇见的问题: 报跨域错误 但是已经设置了代理&#xff0c;仍然无效。 2.解决&#xff08;多次遇见此问题&#xff0c;特此记录&#xff09;&#xff1a; 最后发现是这里少写了/api&#xff0c;遇见以api开头的接口&#xff0c;则把这些接口转发到target所指向…

32单片机基础:GPIO输出

目录 简介&#xff1a; GPIO输出的八种模式 STM32的GPIO工作方式 GPIO支持4种输入模式&#xff1a; GPIO支持4种输出模式&#xff1a; 浮空输入模式 上拉输入模式 下拉输入模式 模拟输入模式&#xff1a; 开漏输出模式&#xff1a;&#xff08;PMOS无效&#xff0c;就…

详细分析Python中的Pyautogui库(附Demo)

目录 前言1. 基本知识2. 常用方法2.1 通用方法2.2 鼠标操作2.3 消息窗口2.4 截图 前言 该博客主要以入门了解其函数为主&#xff0c;灵活运用&#xff0c;后续会出一些实战结合类&#xff01; 1. 基本知识 PyAutoGUI 是 Python 的一个库&#xff0c;用于实现自动化的图形用户…

信号系统之连续信号处理

1 Delta 函数 连续信号可以分解为缩放和移位的增量函数&#xff0c;就像处理离散信号一样。不同之处在于&#xff0c;连续 delta 函数比其离散函数复杂得多&#xff0c;在数学上也抽象得多。我们不是用它是什么来定义连续 delta 函数&#xff0c;而是用它所具有的特征来定义它…

【眼科大模型】Ophtha-LLaMA2:视觉模型提取图像特征 + LLM基于特征生成眼底病变的诊断报告

Ophtha-LLaMA2&#xff1a;视觉模型提取图像特征 LLM基于特征生成眼底病变的诊断报告 提出背景设计思路选择大模型基座生成诊断报告 论文&#xff1a;https://arxiv.org/pdf/2312.04906.pdf 提出背景 目标是开发一个全面的眼科模型&#xff0c;可以根据不同仪器的检查报告准确…

GitHub | 在 GitHub 上在线展示 Vue 项目

简洁版&#xff1a;上传所有代码 << 构建项目并上传 dist 目录 << 设置仓库 << 访问 Step1&#xff1a;在 GitHub 上新建仓库&#xff0c;并将 Vue 项目的代码 push 到该仓库中。坑点在于&#xff0c;如果你是从 GitHub 上 clone 的别人的项目&#xff0c;那…

vulnhub练习 DC-1复现及分析

一、搭建环境 1.工具 靶机&#xff1a;DC-1 192.168.200.17 攻击机&#xff1a;kali 192.168.200.13 2.注意 攻击机和靶机的网络连接方式要相同&#xff0c;另外DC-1的网络连接方式我这里采用NAT模式&#xff0c;是与kali的网络连接模式相同的&#xff08;当然亦可以选用桥…

国产chat gpt推荐

下述网站响应非常快 会持续更新的! 付费&#xff1a; 小名言 免费&#xff1a; AIchatOS 百度的文心一言

unity学习(32)——跳转到角色选择界面(父子类问题)

新问题 应该是两个脚本之间缺少继承关系 its children 解决起来很简单&#xff0c;把ResceneScript也绑到canvas上就可以了 。 此时&#xff0c;在账号密码正确的情况下&#xff0c;是可以完成场景切换。 对应的代码如下&#xff1a; TMP_Text d GameObject.FindWithTag(&…

板块一 Servlet编程:第五节 Cookie对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第五节 Cookie对象全解 一、什么是CookieCookie的源码 二、Cookie的具体操作&#xff08;1&#xff09;创建Cookie&#xff08;2&#xff09;获取Cookie&#xff08;3&#xff09;设置Cookie的到期时间&#xff08;4&#xff09;设置Cookie的路径…

<网络安全>《42 网络攻防专业课<第八课 - SQL注入漏洞攻击与防范>》

1 SQL注入漏洞利用及防范 1 SQL注入的地位 2 SQL注入的危害及本质 这些危害包括但不局限于&#xff1a; 数据库信息泄漏&#xff1a;数据库中存放的用户的隐私信息的泄露。网页篡改&#xff1a;通过操作数据库对特定网页进行篡改。网站被挂马&#xff0c;传播恶意软件&#…

writing classes ... [xxx of xxxx] 执行时间太长

一、问题展示 二、解决方法 打开设置【File - Settings…】修改堆大小

OpenGL学习——16.多光源

前情提要&#xff1a;本文代码源自Github上的学习文档“LearnOpenGL”&#xff0c;我仅在源码的基础上加上中文注释。本文章不以该学习文档做任何商业盈利活动&#xff0c;一切著作权归原作者所有&#xff0c;本文仅供学习交流&#xff0c;如有侵权&#xff0c;请联系我删除。L…

MySQL 窗口函数温故知新

本文用于复习数据库窗口函数&#xff0c;希望能够温故知新&#xff0c;也希望读到这篇文章的有所收获。 本文以&#xff1a;MySQL为例 参考文档&#xff1a; https://www.begtut.com/mysql/mysql-window-functions.html 使用的样例数据&#xff1a;https://www.begtut.com/m…

Linux|centos7| rust语言的编译开发环境快速部署

前言&#xff1a; rust语言是干什么的&#xff0c;怎么用这些我就不在这里废话了&#xff0c;免得浪费大家的时间&#xff0c;我目前只知道rust音译为铁锈&#xff0c;它的可执行主程序叫cargo&#xff0c;音译为货物 这个语言和python&#xff0c;Java&#xff0c;go等等语言…