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 DocumentDocument    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, 你是OOPElement rootElement = document.getRootElement();// 2. 得到rootElement的student ElementsList<Element> students = rootElement.elements("student");// System.out.println(student.size());//2for (Element student : students) {// element就是Student元素/节点// 获取Student元素 的name ElementElement 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, 你是OOPElement 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+3for (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.rhkb.cn/news/261093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--红黑树详解

什么是红黑树 红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 由于其自平衡的特性,保证…

NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue

项目是fork的Naccl大佬NBlog项目&#xff0c;页面做的相当漂亮&#xff0c;所以选择了这个。可以参考2.3的效果图 惭愧&#xff0c;工作两年了也没个自己的博客系统&#xff0c;趁着过年时间&#xff0c;开始搭建一下. NBlog原项目的github链接&#xff1a;Naccl/NBlog: &#…

展示用HTML编写的个人简历信息

展示用HTML编写的个人简历信息 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

网贷大数据查询多了对征信有影响吗?

网贷大数据在日常的金融借贷中起到很重要的风控作用&#xff0c;不少银行已经将大数据检测作为重要的风控环节。很多人在申贷之前都会提前了解自己的大数据信用情况&#xff0c;那网贷大数据查询多了对征信有影响吗?本文带你一起去看看。 首先要说结论&#xff1a;那就是查询网…

【AI视野·今日Robot 机器人论文速览 第七十八期】Wed, 17 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 17 Jan 2024 Totally 49 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Safe Mission-Level Path Planning for Exploration of Lunar Shadowed Regions by a Solar-Powered Rover Authors Olivier L…

24-k8s的附件组件-Metrics-server组件与hpa资源pod水平伸缩

一、概述 Metrics-Server组件目的&#xff1a;获取集群中pod、节点等负载信息&#xff1b; hpa资源目的&#xff1a;通过metrics-server获取的pod负载信息&#xff0c;自动伸缩创建pod&#xff1b; 参考链接&#xff1a; 资源指标管道 | Kubernetes https://github.com/kuberne…

SpringMVC第一天

SpringMVC简介 1.导入spring-mvc坐标 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.7</version></dependency> 2.在web.xml里配置DispatcherServlet前端控制器 …

dubbo源码中设计模式——注册中心中工厂模式的应用

工厂模式的介绍 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型模式&#xff0c;它在创建对象时提供了一种封装机制&#xff0c;将实际创建对象的代码与使用代码分离。 应用场景&#xff1a;定义一个创建对象的接口&#xff0…

【AI学习】LangChain学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Spring Boot项目怎么对System.setProperty(key, value)设置的属性进行读取加解密

一、前言 之前我写过一篇文章使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置&#xff08;读取时自动解密&#xff09;&#xff0c;对Spring Boot项目的属性读取时进行加解密&#xff0c;但是没有说明对System.setProperty(key, value)设…

5 Nacos本地启动配置

1、修改启动配置 修改nacos-console模块的application.properties,具体如下: 其中,url参数详见链接:

使用AndroidStudio调试Framework

1.前言 最近在工作过程中&#xff0c;涉及到FW的一些修改&#xff0c;比如PhoneWindowManager&#xff0c;只能通过加日志看打印的方式查看一些内容&#xff0c;比较低效&#xff0c;所以想了解一下FW的调试方式&#xff0c;后来发现AS就可以调试FW.我平时都是在Docker服务器编…

多目图像拼接算法

图像拼接一般要经过图像特征提取、特征匹配、融合等步骤来实现。 特征匹配与变换: SIFT(尺度不变特征变换)SURF(加速鲁棒特征)ORB(Oriented FAST and Rotated BRIEF)AKAZE(加速的KAZE特征)全景图像拼接算法: 基于特征匹配的拼接:利用特征点匹配找到重叠区域,然后进…

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…

数学建模:BP神经网络(含python实现)

原理 BP 神经网络&#xff0c;也称为多层感知机&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;&#xff0c;是一种常见的神经网络模型&#xff0c;用于解决各种机器学习问题&#xff0c;包括分类和回归。BP 代表“反向传播”&#xff08;Backpropagation&#…

【Go map的底层实现原理?】

Go中的map是一个指针&#xff0c;占用8个字节&#xff0c;指向hmap结构体 源码包中src/runtime/map.go定义了hmap的数据结构&#xff1a; hmap包含若干个结构为bmap的数组&#xff0c;每个bmap底层都采用链表结构&#xff0c;bmap通常叫其bucket hmap结构体 // A header for…

Linux中alarm/setitimer函数(信号函数)

alarm函数 函数原型&#xff1a; unsigned int alarm(unsigned int seconds); 函数描述&#xff1a;设置定时器&#xff08;闹钟&#xff09;。在指定seconds后&#xff0c;内核会给当前进程发送 14&#xff09;SIGALRM信号。进程收到该信号&#xff0c;默认动作终止。每个进程…

判断一个dll/exe是32位还是64位

通过记事本判断&#xff08;可判断C或者C#&#xff09; 64位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第一个PE&#xff0c;如果后面是d?则为64位 32位、将dll用记事本打开&#xff0c;可以看到一堆乱码&#xff0c;但是找到乱码行的第…

服务网格Service Mesh和Istio

文章目录 服务网格&#xff08;Service Mesh&#xff09;市场上三种服务网格解决方案服务网格的特征流量管理安全性可观察性 Istio简介Istio提供了什么功能服务 &#xff1f;Istio 核心特性流量管理安全可观察性 平台支持 服务网格&#xff08;Service Mesh&#xff09; 服务网…

【Linux】Linux调试器-gdb使用

1. 背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 开始使用 gdb binFile 退出&#xff1a; ctrl d 或 quit 调…