XML+propties
txt文件,properties(属性)文件,XMl文件
txt与properties与XML的区别
当这些文件存储单个关系数据时, 普通文件 无法存储 关系数据,而properties属性文件以键值对形式存储就很方便,XML文件也可以 见图1
但储存多个用户就不行了,XML更适合, 见图2
properties集合
properties 代表属性文件这一类型
load:加载,story储存
properties读属性文件
//掌握properties的基本用法
@org.junit.Test
public void test() throws IOException {
// 1.创建一个properties对象
Properties properties = new Properties();
System.out.println(properties);
// 2.加载属性文件数据到properties对象里
properties.load(new FileReader(new File("E:\\JavaSE_Code_64\\day11\\users.properties")));
// 3. 查看properties全部数据
System.out.println(properties);
// 4.根据键找值 ,查找张无忌的密码
System.out.println(properties.getProperty("张无忌"));
// 5. 获取所有的键集合
Set<String> names = properties.stringPropertyNames();
System.out.println(names);
System.out.println("---------------------------");
// 6. 查看所有的数据
for (String name : names) {
String pw = properties.getProperty(name);
System.out.println(name+":"+pw);
}
System.out.println("---------------------------");
// 使用 forEach properties.forEach((k,v)-> { System.out.println(k+"-->"+v);});
}
properties写属性文件
注意连通输出流到属性文件,第二个参数是注释信息
@org.junit.Test
public void test2() throws IOException {
// 1, 创建一个properties对象,用于读写属性文件
Properties properties = new Properties();
//2. 存一个键值对数据
properties.setProperty("张三","zhangs123");
// 3.把 properties对象的键值对数据输出到属性文件去
properties.store(new FileWriter("E:\\JavaSE_Code_64\\day11\\users2.properties"),"user&password");
}
XML文件
概述
XML:可扩展标记语言
本质是是一种数据的格式,可以用来存储复杂的数据结构,和数据关系
应用场景: 经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输
特点
- XML的标签一般是成对出现的
- XML只有一个根标签
- XML可以有属性值比如id,name等
- XML的标签可以自定义
- 如果一个文件中放的是XML数据,那么这个文件就是XML文件,后缀一般写.xml
idea创建xml文件
file文件,后缀xml就行
xml语法规则
可以渲染到浏览器
<?xml version="1.0" encoding="UTF-8" ?>
<!--XML文件的台头声明 ,版本级别,及编码格式 ,注意该声明必须在第一行,哪怕第一行是注释也不行-->
<!--根标签只有一个-->
<users>
<user id="1">
<name>张无忌</name>
<password>zhangwj123 </password>
<data> <!-- 3<5 && 8>6 -->
3<5&&8>6
<!-- 还可以这样写-->
<![CDATA[
3<5 && 8>6
]]>
</data>
</user>
<user id="2">
<name>赵敏</name>
<password>zhaom123</password>
</user>
<user id="3">
<name>金毛狮王</name>
<password>jingmsw123</password>
</user>
</users>
应用场景
Xml作为网络通信
Dom4j
使用
一般用Dom4j工具解析xml文件
Dom4j有个工具SAXReader, 该类的对象可以将解析的xml文档一下子读取到内存中去,把xml文件包装成一个Document对象 ,就可以使用Document对象获取里面的数据了
Dom4j方法
Element 方法
注意 拿数据,只能一层一层的拿,自上而下
<?xml version="1.0" encoding="UTF-8" ?>
<!--XML文件的台头声明 ,版本级别,及编码格式 ,注意该声明必须在第一行,哪怕第一行是注释也不行-->
<!--根标签只有一个-->
<users>
<user id="1">
<name>张无忌</name>
<password>zhangwj123 </password>
<data> <!-- 3<5 && 8>6 -->
3<5&&8>6
<!-- 还可以这样写-->
<![CDATA[
3<5 && 8>6
]]>
</data>
</user>
<user id="2">
<name>赵敏</name>
<password>zhaom123</password>
</user>
<user id="3">
<name>金毛狮王</name>
<password>jingmsw123</password>
</user>
<peoper>幸福安康</peoper>
</users>
获取所有的一级标签和二级标签
//获得一级二级所有的标签
@Test
public void test2() throws DocumentException {
//1. 使用SAXReader工具解析xml文件到内存中去
SAXReader saxReader = new SAXReader();
//2. 将xml文件包装成一个document对象
Document document = saxReader.read("E:\\JavaSE_Code_64\\day11\\user.xml");
//3. 获取根标签
Element rootElement = document.getRootElement();
//4. 获取根标签下一级所有标签
List<Element> elements = rootElement.elements();
for (Element firstElement : elements) {
System.out.println(firstElement.getName());
//5. 获得二级所有标签
for (Element secondElement : firstElement.elements()) {
System.out.println(" " + secondElement.getName());
}
}
}
- 获取指定索引的标签,
- 通过id名,获取其属性/属性值
- 获取标签的文本
//获取指定根元素下的指定二级目录的值
@Test
public void test3() throws DocumentException {
//1. 解析xml文件成一个document对象
//1.1 创建解析器对象
SAXReader saxReader = new SAXReader();
//1.2 使用解析器将xml读到内存,并包装成一个document对象
Document document = saxReader.read("E:\\JavaSE_Code_64\\day11\\user.xml");
//2.获取根元素
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName()); //users
//3.定位到根下一级标签的赵敏的user属性
Element firstElement = rootElement.elements().get(1); //user
//4. 直接获得其name和pw属性值
System.out.println(firstElement.elementText("name"));//赵敏
System.out.println(firstElement.elementText("password"));//zhaom123
//5. 获取其user的id值
System.out.println(firstElement.attributeValue("id"));//2
for (Element element : firstElement.elements()) {
System.out.println(element.getText()); //赵敏 zhaom123 }
}
根据某标签获取其指定子标签,及文本内容
// 快速获取标签文本
@Test
public void test4() throws DocumentException {
//1. 解析xml文件成一个document对象
//1.1 创建解析器对象
SAXReader saxReader = new SAXReader();
//1.2 使用解析器将xml读到内存,并包装成一个document对象
Document document = saxReader.read("E:\\JavaSE_Code_64\\day11\\user.xml");
//2.获取根元素
Element rootElement = document.getRootElement();
//3. 获取指定标签
Element peoper = rootElement.element("peoper");
//4.获得指定标签的文本
System.out.println(peoper.getText()); //幸福安康
}
获取其标签文本内容
//获取元素的属性信息
@Test
public void test5() throws DocumentException {
//1. 解析xml文件成一个document对象
//1.1 创建解析器对象
SAXReader saxReader = new SAXReader();
//1.2 使用解析器将xml读到内存,并包装成一个document对象
Document document = saxReader.read("E:\\JavaSE_Code_64\\day11\\user.xml");
//2.获取根元素
Element rootElement = document.getRootElement();
//获取第三组user标签
Element element = rootElement.elements().get(2);
//获取第三组user标签下的id属性
Attribute id = element.attribute("id");
//获取id的名称
System.out.println(id.getName());//id
//获取其id属性的值
System.out.println(id.getText());//3
System.out.println(id.getValue());//3
}
获取某标签下通过属性名查找其子标签的文本内容
//获取某元素下子元素的文本内容 ,即取出去掉前后空格
@Test
public void test6() throws DocumentException {
//1. 解析xml文件成一个document对象
//1.1 创建解析器对象
SAXReader saxReader = new SAXReader();
//1.2 使用解析器将xml读到内存,并包装成一个document对象
Document document = saxReader.read("E:\\JavaSE_Code_64\\day11\\user.xml");
//2.获取根元素
Element rootElement = document.getRootElement();
//获取第二个user标签
Element element = rootElement.elements().get(0);
//获取第二个user标签下name的值
System.out.println(element.elementText("name")); //张无忌
//获取第二个user标签下的值value
System.out.println(element.elementText("password"));//zhangwj123
// 取出元素文本内容,去除前后空格
System.out.println(element.elementTextTrim("data")); //3<5&&8>6 3<5 && 8>6
}
XMl文件的创建
使用Stringbuilder拼接一个xml文件,先拼接内容,再使用缓冲输出流写到指定的xml文件
//使用Stringbuilder拼接一个xml文件,先拼接内容,再使用缓冲输出流写到指定的xml文件
@Test
public void test1() {
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
sb.append("<users>\n");
sb.append(" <user>").append(" id=").append("\"1\"").append(">\n");
sb.append(" <name>").append("张无忌").append("</name>\n");
sb.append(" <password>").append("zhangwj123").append("</password>\n");
sb.append(" </user>\n");
sb.append(" <user>").append(" id=").append("\"2\"").append(">\n");
sb.append(" <name>").append("赵敏").append("</name>\n");
sb.append(" <password>").append("zhaom123").append("</password>\n");
sb.append(" </user>\n");
sb.append(" <user>").append(" id=").append("\"3\"").append(">\n");
sb.append(" <name>").append("金毛狮王").append("</name>\n");
sb.append(" <password>").append("jingmsw123").append("</password>\n");
sb.append(" </user>\n");
sb.append("</users>\n");
//定义写在try()里面就不用关流了
try (
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\JavaSE_Code_64\\day11\\createXml.xml"));
) {
//写入拼接后的xml内容到xml文件
bw.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user> id="1">
<name>张无忌</name>
<password>zhangwj123</password>
</user>
<user> id="2">
<name>赵敏</name>
<password>zhaom123</password>
</user>
<user> id="3">
<name>金毛狮王</name>
<password>jingmsw123</password>
</use
XMl约束文档
专门用来限制xml书写格式的文档,比如:限制标签,属性应该怎么写
约束文档的分类
- DTD文档
- Schema文档
DTD文档
例子
将约束文档导入xml文件
- 第一行限制根标签必须是书架,子元素必须是一个+个书标
- 书标签里面有书名,作者,售价这些标签
- 书名,作者,售价这些标签可以写内容
schema约束文档
当你的才华配不上你的野心,努力的时候到了!