学习网站:https://www.w3school.com.cn/x.asp
XML概述:全称为(EXtensible Markup Language) 是一种可扩展的语言
标记语言:通过标签来描述数据的一门语言(标签我们有时候也称之为元素)
可扩展:标签的名字是可以自定义的
可以理解为XML是由很多标签组成的,而标签名是可以自定义的
作用:
用来进行存储数据和传输数据
作为软件的配置文件
标签的规则:
标签必须有一对尖括号和合法标识符组成
例如:<student>
标签必须成对出现
<student></student> 第一个是开始标签 第二个是结束标签
特殊的标签是可以不成对,但是必须有结束标记
<address/>
标签中可以定义属性,标签和标签名空格隔开,属性值必须用引号引起来
<student id="1"><student> student就是标签名 id就是属性名 中间用空格 1用引号引起来 单双引号都可以 但必须成对,不能一单一双
标签必须正确的嵌套
正确示例:<student id="1"><name>张三</name></student>
错误示例:<student id="1"><name>张三</student></name>
XML语法规则:
1.XML的文件后缀名为:xml
2.文档声明必须是第一行第一列
<?xml version= "1.0" encoding = "UTF-8" standalone= "yes" ?>
version:该属性是必须存在的
encoding:该属性不是必须的,表示打开当前xml文件应该使用什么字符编码表(一般取值是UTF-8)
standalone:该属性不是必须的,描述XML文件是否依赖其他的XML文件,取值为yes/no
3.必须存在一个根标签,有且只有一个
4.xml文件中可以定义注释信息
5.xml文件可以存在特殊字符
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
6.XML文件中可以存在CDATA区
<![CDATA{...内容...}]>
示例:
再SRC目录下创建同级目录student.xml文件
<?xml version="1.0" encoding= "UTF-8"?>
<!--注释的写法-->
<!--这个xml用来描述多个学生信息-->
<students>
<!--第一个学生信息-->
<students id="1">
<name>张三</name>
<age>22</age>
<info>学生的<张三></info>
<message><![CDATA[里边可以写一些我们想写的内容特殊字符也可以<<<>>>>并不会影响报错]}]]></message>
</students>
<!--第二个学生信息-->
<students id="2">
<name>李四</name>
<age>18</age>
</students>
</students>
XML解析
常见的解析思想
DDM(Document()Object Model)文档对象模型
就是把文档的各个组成部分看做想对应的对象
会把XML文件全部加载到内存中
再内存中形成一个树形结构,再获取相应的值
就像剥玉米一样,先获取到整体,在一层一层的进入
Document对象:整个xml文档
Element对象:所有标签
Attribute:所有属性
Text对象:所有文本内容
都有一个父类Node对象
XML的解析工具
JAXP:SUN公司提供的一套XML的解析API
JDOM:开源组织提供了一套XML的解析的API—jdom
DOM4J(全称:Dom For Java): 开源组织提供了一套XML的解析的API-dom4j
pull:主要引用再Android手机端解析xml
主要学习DOM4J 可以通过https://dom4j.github.io/去下载dom4j
下载压缩包解压
再SRC目录下创建同级目录libs 并把文件夹中的dom4j-1.6.1.jar 粘贴到libs 并右键单击jar包 点击Add as Library 表示要导入到当前项目中
需求:解析这个xml文件,将解析到的数据封装到学生对象中,并将学生对象存储到ArrayList集合中,遍历集合
xml文件内容:
需要加一个学生类
public class Student {
private String id;
private String name;
private int age;
public Student(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name=" + name +
", age=" + age +
'}';
}
}
测试类:
/**
* 利用dom4j解析XML文件
*/
public class test {
public static void main(String[] args) throws DocumentException {
//获取解析器对象
SAXReader saxReader=new SAXReader();
//利用解析器把xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read(new File("D:\\workspace\\xmle\\xml\\studnet.xml"));
//获取到根标签
Element rootElement = document.getRootElement();
//通过根标签获取student标签
//elements()获得所有的子标签 会把这些子标签放到一个集合
List elements = rootElement.elements();
System.out.println(elements.size());
//element("标签名") 可以获取调用者所有的指定的子标签,会把这些子标签放到一个集合中并返回
List<Element> studnet = rootElement.elements("students");
//用来装学生对象
ArrayList<Student> list=new ArrayList<>();
//遍历集合得到每一个标签
for (Element element : studnet) {
//element标识每一个student标签
//获取到id的属性值
Attribute attribute = element.attribute("id");
String id = attribute.getValue();
//获取name标签
//element("name") 获取调用者指定的子标签
Element name = element.element("name");
//获取这个标签的标签体
String text = name.getText();
//获取age标签
Element age = element.element("age");
//获取age的标签体
String text1 = age.getText();
Student s=new Student(id,text,Integer.parseInt(text1));
list.add(s);
}
//遍历操作
for (Student student : list) {
System.out.println(student);
}
}
}