当前位置: 首页 > news >正文

Java XML

1、XML文件介绍

配置文件:用来保存设置的一些东西。

拿IDEA来举例,比如设置的背景图片,字体信息,字号信息和主题信息等等。

(1)以前是用txt保存的,没有任何优点,而且不利于阅读,因为只保存了值,值所代表的含义却不清楚。

(2)后面又提出了properties文件,是以键值对的形式存储数据的,但是对于多个用户的同一个信息来说的话,只能以一个键值对来进行存储,无法为同一个信息配置多个键值对。

(3)所以现在来学习xml文件。xml文件可解决这个问题。

xml是可扩展的标记语言,那什么是可扩展?什么是标记语言?

标记就是标签。可扩展就是可以自定义。

下面是一个例子,可以很清楚地看到多个用户的不同信息。

2、XML文件基本语法

(1)XML文件的创建

文件后缀名为.xml,注意是小写的。

(2)XML文件的文档声明

第一行必须是文档声明,这个不需要去背,只需输入一个<,IDEA就会自动进行提示。

version:XML默认的版本号,该属性是必须存在的。

encoding:本XML文件的编码。

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

还有一点文档声明必须放在第一行顶格写,下面这两种不放在第一行和不顶格写都是错的。

(3)XML文件的标签规则

①标签必须成对出现,比如下面的student标签,且根标签只能有一个。

②也有一些特殊的单标签,比如<br/>。

③标签里面还可以有属性以及属性的值。

④标签中的文本内容,比如张三就是name标签的文本内容。

(4)XML文件的注释信息:<!- 注释内容 -->

不用记,只需要选中内容然后用IDEA的快捷键就可以了:crtl+shift。

(5)XML文件中的特俗符号

由于平常用来表示大于>、小于<等等的一些符号在XML文件中是用来表示标签的开始和结束的,所以提出了别的符号用来表示大于、小于这些。

(6)XML文件中的CDATA区

格式:<![CDATA[内容]]>

这种格式下的内容都会当成最原始的符号,不会有xml文件中的特殊意义,比如<就是小于的意思。

(7)代码书写要求

从左到右依次书写,当写完开始标签的>时会自动把结束标签补上。

3、XML文件的约束文档

由于XML文件可以自定义标签,如果随意定义会导致XML文件在解析时可能会出现问题。

为了避免这种情况的出现,就提出了一系列要求,强制程序员必须按照要求进行规定进行书写。

我们不用掌握约束文档怎么写,只需要根据给出的约束文档知道如何去编写XML文件就可以了。

约束分为两类:DTD和scheme。

(1)如何利用DTD约束文档编写一个符合要求的XML文件?

我们需要掌握的有3点:

①约束文档的格式为dtd。

②如何引入本地的dtd文件。

③如何根据约束书写XML文件。

(2)如何利用scheme约束文档编写一个符合要求的XML文件?

由于DTD约束文档没办法约束数据类型,所以提出了scheme约束文档。

(1)scheme约束文档的格式

scheme约束文档本身就是一个XML文件,也被其他的scheme约束文档所约束。

这是一个scheme约束文档的内容,其中需要学习的就是红色方框中的内容:

 (2)如何引入scheme约束文档?

只需这一行就可以。

上面虽然讲了这么多,但真正需要掌握的就是把scheme约束文档复制到XML文件的目录下,然后输入<之后根据提示直接使用就可以了,都不需要写第二步。

4、XML文件的解析

解析XML文件就是读取文件中的数据。

解析的方式:Dom4j。

(1)Dom4j的解析方式

这种方式是读取整个XML文件之后,按照树形结构存储,大概就是下面图示的样子。以及需要掌握Doucument、Element、Attribute和Text4个对象的含义。

(2)如何使用Dom4j解析XML文件?

首先要想使用dom4j,就要先下载包,网址:DOM4J

还有一点就是从XML文件中解析完数据之后可以封装到对象中,要不然数据都是一个个零散的。

①比如有这样一个XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!--注释的内容-->
<!--本xml文件用来描述多个学生信息-->
<students><!--第一个学生信息--><student id="1"><name>张三</name><age>23</age></student><!--第二个学生信息--><student id="2"><name>李四</name><age>24</age></student></students>

②Student类: 

public class Student {private String id;private String name;private int age;public Student() {}public Student(String id, String name, int age) {this.id = id;this.name = name;this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id='" + id + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}

③利用dom4j去解析XML文件: 

1.获取一个解析器对象;

2.利用解析器把xml文件加载到内存中,并返回一个文档对象;

3.获取到根标签;

4.通过根标签来获取student标签;

elements():可以获取调用者所有的子标签,并把这些子标签放到一个集合中返回。
elements("标签名"):可以获取调用者指定的所有子标签,并把这些子标签放到一个集合中并返回。

/*** 利用dom4j解析xml文件*/
public class XmlParse {public static void main(String[] args) throws DocumentException {//1.获取一个解析器对象SAXReader saxReader = new SAXReader();//2.利用解析器把xml文件加载到内存中,并返回一个文档对象Document document = saxReader.read(new File("myxml\\xml\\student.xml"));//3.获取到根标签Element rootElement = document.getRootElement();//4.通过根标签来获取student标签//elements():可以获取调用者所有的子标签.会把这些子标签放到一个集合中返回.//elements("标签名"):可以获取调用者所有的指定的子标签,会把这些子标签放到一个集合中并返回//List list = rootElement.elements();List<Element> studentElements = rootElement.elements("student");//System.out.println(list.size());//用来装学生对象ArrayList<Student> list = new ArrayList<>();//5.遍历集合,得到每一个student标签for (Element element : studentElements) {//element依次表示每一个student标签//获取id这个属性Attribute attribute = element.attribute("id");//获取id的属性值String id = attribute.getValue();//获取name标签//element("标签名"):获取调用者指定的子标签Element nameElement = element.element("name");//获取这个标签的标签体内容String name = nameElement.getText();//获取age标签Element ageElement = element.element("age");//获取age标签的标签体内容String age = ageElement.getText();//            System.out.println(id);
//            System.out.println(name);
//            System.out.println(age);Student s = new Student(id,name,Integer.parseInt(age));list.add(s);}//遍历操作for (Student student : list) {System.out.println(student);}}
}

(3)后面又提出了Xpath,可以根据如何使用Xpath解析XML文件。

Xpath底层依赖dom4j,所以如果要使用Xpath的话记得也要导dom4j的包。

有4种解析方式:绝对路径检索、相对路径检索、全文检索以及属性检索。

以及提供两个检索方法:

①selectNodes("路径"):查询满足路径的所有

②selectSingleNodes("路径"):查询满足路径的一个,如果同时有多个满足,则返回第一个。

关于路径有4种:

首先先来介绍一下各个符号的含义:/表示单级路径,//表示多级路径,@表示属性。

1.绝对路径:从根标签开始。

2.相对路径:相对于当前标签的路径,而.就表示当前标签的路径。

3.全文检索

①//name:在整个xml文件种查找name这个标签

②//person/name和//person//name两个的区别:

//person/name:是查找到person标签以后,再找person的子标签是name的。

//person//name:无论name是子标签还是孙标签都可以。

4.属性检索

①//@属性名,比如//@id

②//元素[@属性名]:查找带有属性名的标签

③//元素[@属性名 = '值']:查找带有属性为某个值的标签

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Rust练习】12.枚举
  • dp算法练习【7】
  • 使用i2c子系统驱动i2c oled模块
  • 基于移动互联网的校内物业报修管理系统设计与实现(论文+源码)_kaic
  • FFmpeg读取文件列表
  • 【Android面试八股文】你能说说FragmentPagerAdapter 和 FragmentStatePagerAdapter的区别吗?
  • Go 语言的优势
  • Hash Table、HashMap、HashSet学习
  • nvm详细安装使用教程和详细命令,以及提示” ‘nvm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件“处理办法
  • Arduino IDE(集成开发环境)的安装过程
  • 应用层简单实现udp / tcp网络通信
  • 网络学习-eNSP配置NAT
  • 《JavaEE进阶》----12.<SpringIOCDI【扫描路径+DI详解+经典面试题+总结】>
  • ArcGIS的8个“合并”功能要分清——矢量:编辑器合并,复制粘贴,工具合并、追加、联合——栅格:镶嵌、镶嵌至新栅
  • GNSS CTS GNSS Start and Location Flow of Android15
  • HTML中设置input等文本框为不可操作
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java超时控制的实现
  • Java-详解HashMap
  • underscore源码剖析之整体架构
  • vue总结
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 初识MongoDB分片
  • 三栏布局总结
  • 一份游戏开发学习路线
  • 译米田引理
  • 用简单代码看卷积组块发展
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 《天龙八部3D》Unity技术方案揭秘
  • Java总结 - String - 这篇请使劲喷我
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​2020 年大前端技术趋势解读
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #if等命令的学习
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (ZT)一个美国文科博士的YardLife
  • (多级缓存)缓存同步
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (接口封装)
  • (九)信息融合方式简介
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (学习日记)2024.02.29:UCOSIII第二节
  • .a文件和.so文件
  • .DFS.
  • .Net core 6.0 升8.0
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NetCore发布到IIS
  • .Net中ListT 泛型转成DataTable、DataSet
  • .net中调用windows performance记录性能信息
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Autowired注解的实现原理