目录
1、什么是XML文件?和properties属性文件有什么区别?和txt文本文件有什么区别?
2、XML文件的用途
3、XML的格式
4、如何解析XML文件
5、如何写入XML文件
6、约束XML的书写格式
6.1 DTD文档-约束书写格式,但是不能约束具体的数据类型
6.2 schema文档-约束书写格式,可以约束具体的数据类型
1、什么是XML文件?和properties属性文件有什么区别?和txt文本文件有什么区别?
XML(EXtensible Markup Lannguange,可扩展标记语言)
我们都知道txt文件,是一个普通的文本文件,里面的内容可以随便写,格式也很随意。所以我们读取里面有对应关系的数据需要挨个解析,较为麻烦。
而Properties的书写格式就有格式要求,文件内容都是一些键值对,方便我们去获取键值对里面的信息,例如账号密码等信息。
而XML文件则是存储复杂的数据结构和数据关系,本质是一种数据的格式。例如存储多个用户的用户名密码时,用Properties属性文件则显得乏力了。
来张图演示一下:
我上一篇详细解释properties属性文件的概念、作用、读取和写入方式,不清楚的同学可以先了解一下:
Properties文件:Properties属性文件键值对的获取方法、如何写入信息到Properties属性文件、Properties对象的用法-****博客
2、XML文件的用途
1、作为系统的配置文件
2、作为一种特殊的数据结构,在网络中进行传输
举一个例子
我们在淘宝买东西,下单时填了收货地址。
顺丰快递平台收到你的订单信息,按照你的地址给你发货。
但是你是在淘宝下单的时候才填的地址,并没有去顺丰平台填地址。
所以这个地址信息就是淘宝平台通过XML文件形式封装好通过网络传输给顺丰平台的。
3、XML的格式:
注意一:<?xml version="1.0" encoding="utf-8" ?>这行是必须要写的,且必须放在首行(前面有注释都不行哦)。
表示版本为1.0,以utf-8字符集来编码
注意二:根标签只能有一个,子标签可以有多个
注意三:标签是成对存在的,记得嵌套正确
<?xml version="1.0" encoding="utf-8" ?>
<!--Users是一个根标签,必须只能有一个,而Users里面的子属性可以有多个-->
<!--根标签名字随意取-->
<Users>
<user id="1">
<name>张三</name>
<age>18</age>
<address>广州</address>
</user>
<userAttribute>都是爱学习的人</userAttribute>
<user id="2">
<name>李四</name>
<age>25</age>
<address>哈尔滨</address>
</user>
<!--以下是带有大于号小于号等特殊字符的写法-->
<special>
<![CDATA[
5 > 2 && 3 < 5
]]>
</special>
<!--特殊字符用法二-->
<special> 5 > 2 && 3 < 5 </special>
</Users>
XML文件可以在浏览器中查看,我们打开浏览器看到,我们写的特殊字符的格式是我们所预期的
语法规则:
4、如何解析XML文件?
对于文件的读取和解析,相信很多同学第一反应就是IO流。但是太过于繁琐啦,难度也较大!
所以我们建议使用Dom4j(第三方研发)框架来解析XML文件,方便且好用!
我是maven工程,直接引入依赖即可
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
(需要解析的XML文件对象在本文第3点的格式样例中,同学们参照那个来。)
第一步:创建一个dom4j提供的解析器对象
第二步:将xml文件读取到我们的内存当中
第三步:xml文档信息已经解析到内存当中,我们可以操作这个文档信息了。
public class XMLRead {
public static void main(String[] args) throws Exception {
//创建一个dom4j提供的解析器对象
SAXReader saxReader = new SAXReader();
//将xml文件读取到我们的内存当中,获取到这个Document 对象之后就可以读取里面的数据了
Document document = saxReader.read("src/main/resources/xmlConfigTest.xml");
//1、获取根元素对象里面的所有信息,下面根据这个根元素对象去获取想要的数据
Element rootElement = document.getRootElement();
System.out.println(rootElement.getName());
System.out.println("-----");
//2、获取根元素里面的一级子元素
List<Element> elements = rootElement.elements();
for (Element element : elements){
System.out.println(element.getName());
}
System.out.println("-----");
//3、获取第一个user子元素里面的指定数据
Element name = rootElement.element("user").element("name");
System.out.println(name.getText());
Element address = rootElement.element("user").element("address");
System.out.println(address.getText());
System.out.println("-----");
//4、获取第一个user子元素里面的指定数据(方式二)
Element firstUser = rootElement.element("user");
System.out.println(firstUser.elementText("age"));
System.out.println("-----");
//5、获取含有特殊字符的第一个special属性数据
Element special = rootElement.element("special");
System.out.println(special.getTextTrim());
}
}
可以对照代码里面的注释来看我们打印出来的日志,非常清晰明了,也非常简单好用!
5、如何写入XML文件
在实际应用中,我们不建议用domj4来把数据写到XML文件去,因为需要创建很多对象,非常繁琐。
建议直接把程序里的数据拼接成XML格式,然后用IO流写出去!
public class XMLWriter {
public static void main(String[] args) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n");
stringBuilder.append("<School>\r\n");
stringBuilder.append("\t<ClassRool>" + "北京大学" + "</ClassRool>\r\n");
stringBuilder.append("\t<StudentNum>" + "1000" + "</StudentNum>\r\n");
stringBuilder.append("</School>\r\n");
try (
BufferedWriter bufferedWriter =
new BufferedWriter(new FileWriter("src/main/resources/xmlWriterTest.xml"))
) {
bufferedWriter.write(stringBuilder.toString());
}catch (Exception e){
e.printStackTrace();
}
}
}
可以看到,我们将数据自己拼接成xml格式写入到了xml文件中。
6、约束XML的书写格式
我们解析XML文件格式时,应该要清楚原本的格式才能解析,所以我们需要给XML的书写格式进行约束,防止接收到的文件格式不正确而导致解析出错的情况。
做了约束之后,是不能随意更改XML书写格式的,这样方便接收方解析文件
6.1 DTD文档-约束书写格式,但是不能约束具体的数据类型
我直接截图黑马老师的课件给大家演示一下
6.2 schema文档-约束书写格式,可以约束具体的数据类型
我直接截图黑马老师的课件给大家演示一下
这就是我对XML文件相关知识的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!
后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤