三十.特殊文件
30.1 xml概述
可扩展标记语言
可扩展:标签名字可以自己定义
优点:易于阅读,可以配置成组出现的数据
缺点:解析比较复杂
作用:
- 用于进行存储数据和传输数据
- 作为软件的配置文件
作为配置文件的优势:
- 可读性好
- 可维护性高
30.1 xml文件
可扩展标记语言
注意点:
-
属性值用双引号包裹
-
一个元素可以有多个属性
-
属性值中不能直接包含<、“、&不建议使用的字符:‘、>
-
所有XML元素都必须有结束标签
-
XML标签对大小写敏感
-
XML必须正确的嵌套
-
同级标签以缩进对齐
-
元素名称可以包含字母、数字或其他的字符
-
元素名称不能以数字或者标点符号开始
-
元素名称中不能含空格
-
CDATA数据区域内容随便写
如下 xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有且 定格写 -->
<!-- 根标签只能有一个 -->
<users>
<user id="1" desc="第一个用户">
<name>张三</name>
<sex>男</sex>
<地址>南京路</地址>
<password>8888</password>
<data> 3 < 2 && 5 > 4 </data>
<data1>
<![CDATA[
3 < 2 && 5 > 4
]]>
</data1>
</user>
<people>路人A</people>
<people>路人B</people>
<user id="2">
<name>李四</name>
<sex>女</sex>
<地址>上海路</地址>
<password>6666</password>
<data> 3 < 2 && 5 > 4 </data>
<data1>
<![CDATA[
3 < 2 && 5 > 4
]]>
</data1>
</user>
</users>
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id = "1">
<name>zhangsan</name>
<age>18</age>
</person>
<person id = "2">
<name>lisi</name>
<age>19</age>
</person>
<name>zhaoliu</name>
</persons>
30.2 Dom4J解析xml
Dom4J解析xml需要自己提前部署号Dom4J框架,即导Dom4j包
解析思想:
通过SAXReader解析器把xml文件解析成Document文档对象。
Element:表示标签
Attribute:表示属性
Text :表示文本
Element/Attribute/Text 有共同的父类:Node(节点)
30.2.1 案列1
//解析helloworld.xml文件,文件在30.1中
public class Test01 {
public static void main(String[] args) throws DocumentException {
// 创建一个Dom4J框架提供的解析器对象
SAXReader saxReader = new SAXReader();
//2.使用saxReader对象把需要解析的XML文件读成一个Document对象。
Document document = saxReader.read(
"code_java02\filedemo\helloworld.xml");
// 3、获得根元素对象
Element root = document.getRootElement();
System.out.println(root.getName());//users
// 获取根元素下的全部一级子元素。
List<Element> elements1 = root.elements();
for (Element element : elements1) {
System.out.println(element.getName());
// user people user
}
// 获取根元素下的全部一级子元素user。
List<Element> elements2 = root.elements("user");
for (Element element : elements2) {
System.out.println(element.getName());//user user
}
// 获取当前元素下的某个子元素的数据
// //如果下面有很多子元素people,默认获取第一个。
Element people = root.element("people");
System.out.println(people.getText());//路人A
// 获取元素的属性信息
Element user = root.element("user");
System.out.println(user.attributeValue("id"));//1
// Attribute id = user.attribute("id");
// 获取属性对象
Attribute id = user.attribute("id");
System.out.println(id.getName());//id
System.out.println(id.getValue());// 1
System.out.println(id.getText());// 1
// 获取全部元素的属性信息
List<Attribute> attributes = user.attributes();
for (Attribute attribute : attributes) {
System.out.println(attribute.getName()+
"="+attribute.getValue());
//id=1 desc=第一个用户
}
// 如何获取全部的文本内容:获取当前元素下的子元素文本值
System.out.println(user.elementText("name"));//张三
System.out.println(user.elementText("地址"));//南京路
System.out.println(user.elementText("password"));
//8888
// 获取user下的data文本值
Element data = user.element("data");
System.out.println(data.getText());
// 3 < 2 && 5 > 4
//取出左右空格
System.out.println(data.getTextTrim());
//3 < 2 && 5 > 4
}
}
//Person.xml文件在30.1中
//标准JavaBean类
public class Peoson {
private String id;
private String name;
private int age;
public Peoson(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
...
@Override
public String toString() {
return "Peoson{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
=====================================================
public class PesonTest {
public static void main(String[] args) throws DocumentException {
ArrayList<Peoson> list = new ArrayList<>();
// 创建解析器对象
SAXReader sr = new SAXReader();
// 利用解析读取xml文件,并返回文档对象
File file = new File("code_java02\filedemo\person.xml");
Document document = sr.read(file);
// System.out.println(document);
// 获取根元素对象
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName());//persons
// 获取根标签下的全部一级子标签
List<Element> elements = rootElement.elements();
for (Element element : elements) {
//System.out.println(element.getName());
//person person
// 获取属性
Attribute id = element.attribute("id");
// 获取属性值
String idValue = id.getText();
// 获取标签name
Element name = element.element("name");
// 获取标签name文本值
String nameValue = name.getText();
// 获取标签age
Element age = element.element("age");
// 获取标签age文本值
String ageValue = age.getText();
// 因为Person类中的age是int型,所引需要类型转换
int ageInt = Integer.parseInt(ageValue);
//System.out.println(idValue+","+nameValue+","+ageValue);
// 把Person对象添加到集合中
Peoson p = new Peoson(idValue,nameValue,ageInt);
list.add(p);
}
// 打印集合
System.out.println(list);
// Stream流打印
list.stream().forEach(s-> System.out.println(s));
}
}
30.2.2 案例2
解析xml中数据,并将数据添加到对象中,然后把对象添加到集合中,根据对象的用户名和密码判断登录是否成功
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id = "1">
<name>zhangsan</name>
<age>18</age>
</person>
<person id = "2">
<name>lisi</name>
<age>19</age>
</person>
</persons>
public class User {
private String id;
private String userName;
private String password;
private String personId;
private String phoneId;
private boolean admin;
public User() {}
public User(String id, String userName, String password, String personId, String phoneId, boolean admin) {
this.id = id;
this.userName = userName;
this.password = password;
this.personId = personId;
this.phoneId = phoneId;
this.admin = admin;
}
public String getId() { return id;}
public void setId(String id) {this.id = id;}
public String getPassword() {return password;}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {return userName;}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPersonId() {return personId;}
public void setPersonId(String personId) {
this.personId = personId;
}
public String getPhoneId() {return phoneId;}
public void setPhoneId(String phoneId) {
this.phoneId = phoneId;
}
public boolean isAdmin() {return admin;}
public void setAdmin(boolean admin) {this.admin = admin;}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
", personId='" + personId + '\'' +
", phoneId='" + phoneId + '\'' +
", admin=" + admin +
'}';
}
}
==========================================
public class UserTest {
public static void main(String[] args) throws DocumentException {
// 创建集合,存放User对象
ArrayList<User> list = new ArrayList<>();
// 创建解析器对象
SAXReader sr = new SAXReader();
// 创建File对象
File file = new File(
"code_java02\\src\\xmlproperties\\test03\\user.xml");
// 利用解析读取xml文件,去获得文档对象
Document document = sr.read(file);
// 获得根元素
Element rootElement = document.getRootElement();
// 获得根元素下的全部一级子元素
List<Element> elements = rootElement.elements();
for (Element element : elements) {
// element:表示每一个根元素的下的一级子元素
// 获取user标签的属性id
Attribute id = element.attribute("id");
// 获取属性id的文本值
String idText = id.getText();
// 获取用户名标签以及标签文本值
Element username = element.element("username");
String usernameText = username.getText();
// 获取密码标签以及文本值
Element password = element.element("password");
String passwordText = password.getText();
// 获取personId
Element personId = element.element("personId");
String personIdText = personId.getText();
// 获取phoneId
Element phoneId = element.element("phoneId");
String phoneIdText = phoneId.getText();
// 获取权限,是否为管理员
Element admin = element.element("admin");
String adminText = admin.getText();
boolean b = Boolean.parseBoolean(adminText);
// 创建对象,并将从xml中获得的数据赋值给对象
User user = new User(
idText,usernameText,passwordText,
personIdText,phoneIdText,b);
// 将对象添加到集合中
list.add(user);
}
System.out.println(list);
System.out.println("请输入用户名:");
Scanner sc = new Scanner(System.in);
String userName = sc.nextLine();
System.out.println("请输入用户密码:");
String userPassword = sc.nextLine();
int index = getIndex(list, userName);
if (index>=0){
User user = list.get(index);
if(user.getPassword().equals(userPassword)){
System.out.println("登录成功!");
}
}else {
System.out.println("用户不存在!");
}
}
// 定义方法,查询username在集合中的索引
public static int getIndex(ArrayList<User> list,String userName){
for (int i = 0; i < list.size(); i++) {
User user = list.get(i);
if(user.getUserName().equals(userName)){
return i;
}
}
return -1;
}
}