day08-XML
XML
官方文档:https://www.w3school.com.cn/xml/index.asp
1.为什么需要xml?
- 需求1:两个程序间进行数据通信?
- 需求2:给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码
- spring中的IOC配置文件beans.xml,mybatis的xxxMapper.xml文件,tomcat的server.xml,web.xml文件
- xml能存储复杂的数据关系
xml技术用于解决什么问题?
解决程序间数据传输的问题:
比如qq之间的数据传送,用xml格式来传输数据,具有良好的可读性,可维护性
以前两个程序间的通信用xml作为数据通信的格式,现在一般用json
xml可以做配置文件
xml做配置文件可以说是非常的普遍,比如我们的tomcat服务器的server.xml web.xml
xml可以充当小型的数据库
我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用xml文件来做小型数据库,而且直接读取文件显然要比读取数据库快
现在也不太使用xml作数据存储了
2.xml语法
- 快速入门
需求:使用idea创建Students.xml存储多个学生信息
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 1.xml:表示该文件的类型为xml
2.version 表示版本
3.encoding="UTF-8" 文件编码为UTF-8
4.students:root元素/根元素,名字自己定义
5.<student> </student>表示一个students的子元素,可以有多个
6.id就是属性,name,age,gender是student元素的子元素
-->
<students>
<student id="100">
<name>jack</name>
<age>10</age>
<gender>男</gender>
</student>
<student id="200">
<name>Mary</name>
<age>18</age>
<gender>女</gender>
</student>
</students>
- 一个xml文档分为如下几部分内容
- 文档声明
- 元素
- 属性
- 注释
- CDATA区、特殊字符
2.1文档声明
<?xml version="1.0" encoding="UTF-8" ?>
- xml声明放在xml文档的第一行
- xml声明由以下几个部分组成:
- version:文档符合xml1.0规范,我们学习1.0
- encoding:文档字符编码,比如:utf-8
2.2元素
- 元素语法要求:
- 每个xml文档必须有且只有一个根元素
- 根元素是一个完全包括文档中其他所有元素的元素
- 根元素的起始标记要放在所有其他元素的起始标记之前
- 根元素的结束标记要放在所有其他元素的结束标记之后
- xml元素指xml文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式
包含标签体:
<a>www.baidu.com</a>
不含标签体:
<a></a>
,简写为<a/>
一个标签中也可以嵌套若干子标签。但所有的标签必须合理地嵌套,绝对不允许交叉嵌套
- 在很多时候,元素,节点,标签是相同的意思
- xml元素命名规则:
- 区分大小写,例如:
<P>
和<p>
是两个不同的标记 - 不能以数字开头
- 不能包含空格
- 名称中间不能包含冒号
:
- 如果标签单词需要间隔,建议使用下划线
- 区分大小写,例如:
2.3属性
属性介绍:
属性值用双引号
""
或单引号''
分隔(如果属性值中有单引号''
,就用双引号""
分隔,如过属性值中有双引号""
,就用单引号''
分隔)一个元素可以用多个属性,它的基本格式为:
<元素名 属性名="属性值">
特定的属性名称在同一个元素标记中只能出现一次
即属性名称在同一个元素中不能重复
属性值不能包括&字符
2.4注释
<!--这是一个注释-->
- 注释内容中不要出现
--
- 不要把注释放在标记中间。错误写法:
<Name <!--the name-->>TOM</Name>
- 注释不能嵌套
- 可以在除标记以外的任何地方放注释
2.5CDATA节
有些内容不想让解析引擎执行,而是当做原始内容(普通文本)处理,可以使用CDATA括起来,CDATA节中的所有字符都会被当做简单文本,而不是xml标记
语法:
<![CDATA[这里可以把你输入的字符原样显示,不会解析xml]]>
可以输入任意字符(除
]]>
外)不能嵌套
例子
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student>
<code>
<!--如果希望把某些字符串当做普通文本使用,就用CDATA括起来-->
<![CDATA[
<script data-compress=strip>
function h(obj){
alert("一段js代码");
}
</script>
]]>
</code>
</student>
</students>
3.转义字符
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
例子
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student>
<name>jack</name>
<age>10</age>
<gender>男</gender>
<!--转义字符表示一些特殊的字符-->
<resume>年龄<>&</resume>
</student>
</students>
小结:
遵循如下规则的xml文档称为格式正规的xml文档:
- xml声明语句
<?xml version="1.0" encoding="UTF-8" ?>
- 必须有且仅有一个根元素
- 标记区分大小写
- 属性值用引号
- 标记成对
- 空标记关闭
- 元素正确嵌套
4.DOM4j
4.1xml解析技术原理和介绍
xml技术原理
DOM (Document Object Model,文档对象模型)定义了访问和操作文档的标准方法。
- 不管是html文件还是xml文件,都是标记型文档,都可以使用w3c组织制定的dom技术来解析
- document对象表示的是整个文档(可以是html文档,也可以是xml文档)
- DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点
xml解析技术介绍
早期 JDK 为我们提供了两种xml的解析技术:DOM和Sax
- dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析也做了实现
- sun公司在JDK5版本对dom解析技术进行升级:SAX(Simple API for XML)解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。是一行一行地读取xml文件进行解析的,不会创建大量的dom对象。所以它在解析xml的时候,在性能上由于Dom解析
这两种技术已经过时,简单了解即可
- 第三方的XML解析技术
- jdom在dom基础上进行了封装
- dom4j 又对 jdom进行了封装
- pull主要用在Android手机开发,跟sax非常类似,都是事件机制解析xml文件
4.2dom4j介绍
dom4j是一个简单、灵活的开放源代码的库(用于解析/处理xml文件)。dom4j是由早期开发JDOM的人分离出来后独立开发的。
与JDOM不同的是,dom4j使用接口和抽象基类,虽然dom4j的API相对要复杂一些,但他提供了比JDOM更好的灵活性
Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的dom4j
使用dom4j开发,需要下载dom4j对象的jar文件
dom4j的jar包下载地址(内有使用案例):dom4j
官方api文档:Overview (dom4j 1.6.1 API)
4.3dom4j获得document对象的方式
开发dom4j要导入dom4j的jar包
DOM4j中,获得document对象的方式有三种:
读取XML文件,获得document对象
SAXReader reader = new SAXReader();//创建一个解析器
Document document = reader.read(new File("src/input.xml"));//XML Document
解析XML形式的文本,得到document对象
String text = "<members></members>";//直接对一个字符串的xml文本进行解析
Document document = DocumentHelper.parseText(text);
主动创建document对象
Document document = DocumentHelper.createDocument();//创建根节点
Element root = document.addElement("members");
下面只演示方式一的使用:读取XML文件,获得document对象
dom4j应用实例-读取XML文件,获得document对象
使用dom4j对students.xml文件进行增删改查
- 重点讲解查询(遍历和指定查询)
- xml增删改使用少,作为拓展,给出案例
引入dom4j的依赖的jar包
在src文件下创建Dom4j_类以及students.xml文件
students.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student id="01">
<name>小龙女</name>
<gender>女</gender>
<age>16</age>
<resume>古墓派掌门人</resume>
</student>
<student id="02">
<name>欧阳锋</name>
<gender>男</gender>
<age>18</age>
<resume>白驼山弟子</resume>
</student>
</students>
Dom4j_.java:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;
import java.io.File;
public class Dom4j_ {
/**
* 演示如何加载xml文件
*/
@Test
public void loadXML() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//debug-->看看document对象的属性
Document document = reader.read(new File("src/students.xml"));
System.out.println(document);
}
}
如下:在
Document document=reader.read(new File("src/students.xml"));
处打上断点:点击debug,点击step over,可以看到document对象,它代表整个文档。
展开document对象,rootElement代表的就是students根元素
rootElement下面有一个content属性,content属性存储着所有的elementData
点击elementData属性,可以看到该属性有5个对象:
和html-dom解析一样,这五个对象中有三个是换行符号\n,其余的两个才是根元素下面的子元素student
点击展开索引为1的元素对象(即student元素),可以看到该元素对象中又包含了9个对象,除了换行符之外,其余的对象就是student元素的子元素,name节点,gender节点,age节点和resume节点
点击name节点,展开,即可看到name节点的值
document对象的整体结构为:
1.方式一遍历
演示案例1:遍历xml指定元素
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;
import java.io.File;
import java.util.List;
public class Dom4j_ {
/**
* 遍历所有的student信息
*/
@Test
public void listStus() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
//1.得到rootElement
Element rootElement = document.getRootElement();
//2.得到rootElement的student节点
List<Element> students = rootElement.elements("student");
System.out.println(students.size());//2
for (Element student : students) {//student就是student节点/元素
//获取student节点的name节点
Element name = student.element("name");//因为name只有一个,这里用element方法
Element age = student.element("age");
Element gender = student.element("gender");
Element resume = student.element("resume");
System.out.println("学生信息=" + name.getText() + " " +
age.getText() + " " + gender.getText() + " " + resume.getText());
}
}
}
2.方式一查询
案例2:读取指定xml元素
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;
import java.io.File;
public class Dom4j_ {
/**
* 指定读取第一个学生的信息
*/
@Test
public void readOne() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/students.xml"));
//1.得到rootElement
Element rootElement = document.getRootElement();
//2.获取第一个学生
Element student = (Element) rootElement.elements("student").get(0);
//3.输出该学生的信息
System.out.println("学生信息=" +
student.element("name").getText() + " " +
student.element("age").getText() + " " +
student.element("gender").getText() + " " +
student.element("resume").getText());
//4.获取student元素的属性
System.out.println("id="+student.attributeValue("id"));
}
}
- 如果想要省略层层取元素的步骤,直接在根节点取出指定的元素,可以使用xpath(https://dom4j.github.io/#xpath)
3.方式一增删改
day08-XML的更多相关文章
- 学习笔记——xml的入门及解析
需求:根据配置文件创建类,并调用方法 分析:1.XML 2.解析XML 3. 根据全限定名创建对象,调用方法 XML: 可扩展的标签语言 作用:存储数据.(主要用于配置文件) 后缀名.xml 书写规范 ...
- 单例模式、简单工厂模式、XML解析
单例模式: 什么是单例模式? 针对特定问题提出的特定解决方案 为什么使用设计模式? 让程序有更好的可扩展性 在哪里使用? 一般情况下,开发中真正使用设计模式的地方,JVM(虚拟机)底层机制模式 usi ...
- day08 JSP
day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...
- day08:软件系统的体系结构&Tomcat详解&Web应用&http协议
day08 软件系统体系结构 常见软件系统体系结构B/S.C/S 1.1 C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端 ...
- day08 Nginx模块
day08 Nginx模块 lnmp架构 l :Linux n :Nginx m :MySQL p :Python/PHP lnmp架构:是最简单的架构 Nginx中的模块(Python模块):前提是 ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- XML技术之DOM4J解析器
由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...
- UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)
最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...
随机推荐
- 【java】学习路径40-Buffer缓冲区输入流
@Testpublic void testBufferInputStream(){ BufferedInputStream bfis = null; try { bfis = new Buffered ...
- CodeForces - 1625C
Problem - 1625C - Codeforces 题意: 一条马路,有n个限速牌,表示的是从这个限速牌开始到下一个限速牌或者到马路尾的这段距离的速度,你可以拆除其中k个限速牌,问最少的时间是多 ...
- 简析XDP的重定向机制
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 一. XDP Socket示例解析 源码参见:htt ...
- KingbaseES V8R6 集群环境wal日志清理
案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...
- KingbaseES Truncate 与 Delete 机制比较
使用过Oracle的都知道,Truncate操作由于不需要写redo日志,因此,在性能上会比delete操作更高效,但在实际使用过程中,有时会发现delete比truncate速度更快.以下介绍下二者 ...
- Grafana Mimir:支持乱序的指标采集
Grafana Mimir:支持乱序的指标采集 译自:New in Grafana Mimir: Introducing out-of-order sample ingestion 很早之前在使用th ...
- Servlet小结
1.sevlet的生命周期 用户在发送第一次请求的时候Servlet对象被实例化(AServlet的构造方法被执行了.并且执行的是无参数构造方法.) AServlet对象被创建出来之后,Tomcat服 ...
- (数据科学学习手札141)利用Learn Git Branching轻松学习git常用操作
1 简介 大家好我是费老师,Git作为世界上最流行的版本控制系统,可以说是每一位与程序打交道的朋友最值得学习的软件之一.除了管理自己的项目,如果你对参与开源项目感兴趣,那么Git更是联结Github. ...
- tar、gzip、zip、jar是什么,怎么查看?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 如果你是后端程序员,我想你一定见过*.tar.gz.*.zip.*.jar后缀的文件吧,这些都是压缩文件,那这些文 ...
- 我的Go gRPC之旅、01 初识gRPC,感受gRPC的强大魅力
微服务架构 微服务是一种开发软件的架构和组织方法,其中软件由通过明确定义的API 进行通信的小型独立服务组成. 这些服务由各个小型独立团队负责. 微服务架构使应用程序更易于扩展和更快地开发,从而加速创 ...