1、xml(可扩展的标记性语言)的作用
- 用来保存数据,而且这些数据具有自我描述性;
- 可以作为项目或者模块的配置文件;
- 可以作为网络传输数据的格式(现在以JSON为主)。
eg:
<?xml version="1.0" encoding="utf-8" ?>
<!--xml文件的声明,version表示版本,encoding表示编码-->
<students><!--表示多个学生信息-->
<student id="20181002832"><!--表示一个学生信息,id表示学号-->
<name>Marry</name><!--表示学生姓名-->
<sex>girl</sex><!--表示学生姓名性别-->
</student>
<student id="20181002833">
<name>Barry</name>
<sex>boy</sex>
</student>
</students>
2、xml的语法
xml文档必须有根元素,就是顶级元素(没有父标签的元素),而且是唯一一个。
2.1 xml注释
和html一样,<!--注释内容-->
。
2.2 xml元素(标签)
是指从开始标签到结束标签的部分。
2.2.1 命名规则
- 名称可以包含字母、数字以及其他字符;
- 名称不能以数字或者标点符号开始;
- 名称不能包含空格
2.2.2 标签样式
- 单标签<标签名 属性=“值”……/>
- 双标签<标签名 属性=“值”……>文本数据或子标签</标签名>
2.2.3 xml属性
xml属性和html属性类似,可以提供元素的额外信息,一个标签可以书写多个属性,每个属性的值必须用引号括起来。
2.2.4 文本区域(CDATA区)
格式:<![CDATA[这里的字符会原样显示,不会被xml解析]]>
3、xml解析技术
可以用w3c组织制定的dom技术来解析。
早期的JDK提供两种xml解析技术DOM和sax(已过时),第三方解析有:jdom(在dom的基础上进行封装)、dom4j(对jdom进行封装),pull(用在Android开发)。
dom4j解析:
- 新建Students类:
package com.xuan.pojo;
public class Student {
private String id;
private String name;
private String sex;
public Student() {
}
public Student(String id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
- 导入dom4j的包
- xml文件见1中xml示例,解析如下:
package com.xuan.pojo;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jTest {
@Test
public void test1() throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/students.xml");
System.out.println(document);
}
@Test
public void test2() throws Exception{
//读取students.xml文件
SAXReader saxReader = new SAXReader();
//在Junit测试中,相对路径是从模块名开始算的
Document document = saxReader.read("src/students.xml");
//通过Document对象获取根元素students
Element rootElement = document.getRootElement();
//通过根元素获取student标签对象,element()和elements()都是通过标签名查找子元素
List<Element> students = rootElement.elements("student");
//遍历,处理每个student标签转换为Student类
for (Element student:students){
//asXml()把标签对象转换为标签字符串
Element nameElement = student.element("name");
//getText()可以获取标签中的文本内容
String nameText = nameElement.getText();
//elementText()可以直接获取标签名的文本内容
String sexText = student.elementText("sex");
//attributeValue可以获得对应属性值
String id = student.attributeValue("id");
//转换输出
System.out.println(new Student(id,nameText,sexText));
}
}
}
- 输出:
Student{id='20181002832', name='Marry', sex='girl'}
Student{id='20181002833', name='Barry', sex='boy'}