XML

官方文档:https://www.w3school.com.cn/xml/index.asp

1.为什么需要xml?

  1. 需求1:两个程序间进行数据通信?
  2. 需求2:给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码
  3. spring中的IOC配置文件beans.xml,mybatis的xxxMapper.xml文件,tomcat的server.xml,web.xml文件
  4. 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" ?>
  1. xml声明放在xml文档的第一行
  2. xml声明由以下几个部分组成:
    • version:文档符合xml1.0规范,我们学习1.0
    • encoding:文档字符编码,比如:utf-8

2.2元素

  1. 元素语法要求:
  • 每个xml文档必须有且只有一个根元素
  • 根元素是一个完全包括文档中其他所有元素的元素
  • 根元素的起始标记要放在所有其他元素的起始标记之前
  • 根元素的结束标记要放在所有其他元素的结束标记之后
  1. xml元素指xml文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式
  • 包含标签体:<a>www.baidu.com</a>

  • 不含标签体:<a></a>,简写为<a/>

  • 一个标签中也可以嵌套若干子标签。但所有的标签必须合理地嵌套,绝对不允许交叉嵌套

  1. 在很多时候,元素,节点,标签是相同的意思
  2. xml元素命名规则:
    • 区分大小写,例如:<P><p>是两个不同的标记
    • 不能以数字开头
    • 不能包含空格
    • 名称中间不能包含冒号:
    • 如果标签单词需要间隔,建议使用下划线

2.3属性

属性介绍:

  1. 属性值用双引号""或单引号''分隔(如果属性值中有单引号'',就用双引号""分隔,如过属性值中有双引号"",就用单引号''分隔)

  2. 一个元素可以用多个属性,它的基本格式为:<元素名 属性名="属性值">

  3. 特定的属性名称在同一个元素标记中只能出现一次

    即属性名称在同一个元素中不能重复

  4. 属性值不能包括&字符

2.4注释

  1. <!--这是一个注释-->
  2. 注释内容中不要出现 --
  3. 不要把注释放在标记中间。错误写法:<Name <!--the name-->>TOM</Name>
  4. 注释不能嵌套
  5. 可以在除标记以外的任何地方放注释

2.5CDATA节

有些内容不想让解析引擎执行,而是当做原始内容(普通文本)处理,可以使用CDATA括起来,CDATA节中的所有字符都会被当做简单文本,而不是xml标记

  1. 语法:

    <![CDATA[这里可以把你输入的字符原样显示,不会解析xml]]>
  2. 可以输入任意字符(除]]>外)

  3. 不能嵌套

例子

<?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>年龄&lt;&gt;&amp;</resume>
</student>
</students>
  • 小结:

    遵循如下规则的xml文档称为格式正规的xml文档:

  1. xml声明语句<?xml version="1.0" encoding="UTF-8" ?>
  2. 必须有且仅有一个根元素
  3. 标记区分大小写
  4. 属性值用引号
  5. 标记成对
  6. 空标记关闭
  7. 元素正确嵌套

4.DOM4j

4.1xml解析技术原理和介绍

  • xml技术原理

    DOM (Document Object Model,文档对象模型)定义了访问和操作文档的标准方法。

  1. 不管是html文件还是xml文件,都是标记型文档,都可以使用w3c组织制定的dom技术来解析
  2. document对象表示的是整个文档(可以是html文档,也可以是xml文档)
  3. DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点
  • xml解析技术介绍

    早期 JDK 为我们提供了两种xml的解析技术:DOM和Sax

  1. dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析也做了实现
  2. sun公司在JDK5版本对dom解析技术进行升级:SAX(Simple API for XML)解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。是一行一行地读取xml文件进行解析的,不会创建大量的dom对象。所以它在解析xml的时候,在性能上由于Dom解析

这两种技术已经过时,简单了解即可

  • 第三方的XML解析技术
  1. jdom在dom基础上进行了封装
  2. dom4j 又对 jdom进行了封装
  3. pull主要用在Android手机开发,跟sax非常类似,都是事件机制解析xml文件

4.2dom4j介绍

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

  2. 与JDOM不同的是,dom4j使用接口和抽象基类,虽然dom4j的API相对要复杂一些,但他提供了比JDOM更好的灵活性

  3. Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的dom4j

  4. 使用dom4j开发,需要下载dom4j对象的jar文件

    dom4j的jar包下载地址(内有使用案例):dom4j

官方api文档:Overview (dom4j 1.6.1 API)

4.3dom4j获得document对象的方式

开发dom4j要导入dom4j的jar包

DOM4j中,获得document对象的方式有三种:

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

    SAXReader reader = new SAXReader();//创建一个解析器
    Document document = reader.read(new File("src/input.xml"));//XML Document
  2. 解析XML形式的文本,得到document对象

    String text = "<members></members>";//直接对一个字符串的xml文本进行解析
    Document document = DocumentHelper.parseText(text);
  3. 主动创建document对象

    Document document = DocumentHelper.createDocument();//创建根节点
    Element root = document.addElement("members");

下面只演示方式一的使用:读取XML文件,获得document对象

dom4j应用实例-读取XML文件,获得document对象

  1. 使用dom4j对students.xml文件进行增删改查

    • 重点讲解查询(遍历和指定查询)
    • xml增删改使用少,作为拓展,给出案例
  2. 引入dom4j的依赖的jar包

  3. 在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);
}
}
  1. 如下:在Document document=reader.read(new File("src/students.xml"));处打上断点:

  2. 点击debug,点击step over,可以看到document对象,它代表整个文档。

    展开document对象,rootElement代表的就是students根元素

  3. rootElement下面有一个content属性,content属性存储着所有的elementData

  4. 点击elementData属性,可以看到该属性有5个对象:

    和html-dom解析一样,这五个对象中有三个是换行符号\n,其余的两个才是根元素下面的子元素student

  5. 点击展开索引为1的元素对象(即student元素),可以看到该元素对象中又包含了9个对象,除了换行符之外,其余的对象就是student元素的子元素,name节点,gender节点,age节点和resume节点


  6. 点击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"));
}
}

3.方式一增删改

day08-XML的更多相关文章

  1. 学习笔记——xml的入门及解析

    需求:根据配置文件创建类,并调用方法 分析:1.XML 2.解析XML 3. 根据全限定名创建对象,调用方法 XML: 可扩展的标签语言 作用:存储数据.(主要用于配置文件) 后缀名.xml 书写规范 ...

  2. 单例模式、简单工厂模式、XML解析

    单例模式: 什么是单例模式? 针对特定问题提出的特定解决方案 为什么使用设计模式? 让程序有更好的可扩展性 在哪里使用? 一般情况下,开发中真正使用设计模式的地方,JVM(虚拟机)底层机制模式 usi ...

  3. day08 JSP

    day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...

  4. day08:软件系统的体系结构&Tomcat详解&Web应用&http协议

        day08 软件系统体系结构     常见软件系统体系结构B/S.C/S 1.1 C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端 ...

  5. day08 Nginx模块

    day08 Nginx模块 lnmp架构 l :Linux n :Nginx m :MySQL p :Python/PHP lnmp架构:是最简单的架构 Nginx中的模块(Python模块):前提是 ...

  6. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  7. .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  8. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

  9. XML技术之DOM4J解析器

    由于DOM技术的解析,存在很多缺陷,比如内存溢出,解析速度慢等问题,所以就出现了DOM4J解析技术,DOM4J技术的出现大大改进了DOM解析技术的缺陷. 使用DOM4J技术解析XML文件的步骤? pu ...

  10. UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)

    最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...

随机推荐

  1. 自动化选课(Python + selenium

    ​ 前几天听到朋友说自己选课事情,突发奇想想要搞这样一个东西,但是由于各种原因只做到以下的完成度,具体的情况也会在解释的最后留下.这个只适用于曲师大的教务系统,因为用的这个系统来进行的一个调试,对于其 ...

  2. 七分钟学会 HTML 网页制作

    什么是HTML 点击打开视频讲解更加详细 Hyper Text Markup Language(超文本标记语言) 标签控制排版 体积小,方便传输 编写HTLML 推荐使用:VS Code <!D ...

  3. 想学渗透测试,应该考CISP-PTE还是NISP-PT?|网安伴nisp和cisp

    其实两者都可,但要看考生的实际需求! 为什么说两者都可以? 两个证书都由中国信息安全测评中心颁发,CISP-PTE全称国家注册渗透测试工程师,NISP-PT全称国家信息安全水平考试-渗透测试工程师专项 ...

  4. 【IDEA】IDEA打开欢迎页面

    概述 IDEA在默认情况下,会进入最后一个项目.如果项目比较大的话会加载的比较久,这个就比较烦人了,目前我觉得最好的办法就是在设置中直接进入欢迎页面. 解决方案 ① 进入设置 ② Appearance ...

  5. 第五十八篇:webpack的Source Map

    好家伙,Source Map没听过 1.什么是Source Map? 字面意义上来看应该是个好东西 Source Map 就是一个信息文件,里面储存着位置信息. 也就是说,Source Map 文件中 ...

  6. docker容器数据卷的使用

    什么是容器数据卷 docker的理念回顾 将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的! 就好比,你安装一个MySQL,结果你把容器删了,就相当于 ...

  7. ESP8266 NONOS SDK学习

    一.概况 1.存储 ESP8266 带有 160 KB 的 RAM,其中 64 KB 为 iRAM,96 KB 为 dRAM.iRAM 进一步 分成两块:32 KB iRAM 块运行标有 IRAM_A ...

  8. Sentinel源码分析-滑动窗口统计原理

    滑动窗口技术是Sentinel比较关键的核心技术,主要用于数据统计 通过分析StatisticSlot来慢慢引出这个概念 @Override public void entry(Context con ...

  9. IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址和子网掩码相加得到的网络地址是什么意思

    IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址和子网掩码相加得到的网络地址是什么意思 IP地址最后一位斜杠是什么意思?比如192.168.1.10/27?还有IP地址 ...

  10. 《Java基础——线程类》

    Java基础--线程类       一.线程的创建之Thread类: 规则: 通过声明一个新类作为子类继承 Thread 类,并复写 run() 方法,就可以启动新线程并执行自己定义的 run()方法 ...