平时编程总是用到XML文件,却很少认真去了解,今天准备系统的学习一下XML文件
XML的作用和写法
XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
XML 指可扩展标记语言(eXtensible Markup Language)。
可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。 我都没太用过先不了解了
总而言之XML被设计出来是用来传输何存储数据的
<?xml version="1.0" encoding="GBK" ?>
这里encoding表示用什么编码格式来读取我的xml文件,假如我们用的UTF-8编码写的文件,这里写的GBK,就表示用GBK来读取,会导致乱码。如果你不写的话,程序不知道用哪个编码来读,就会以默认的编码来读取这个文件,就可能导致乱码
在XML中有且仅有一个根节点,比如说我定义一个
<students>
<student id="1">
<name>张三</name>
<age>20</age>
<sex>男</sex>
</student>
<student id="2">
<name>李四</name>
<age>20</age>
<sex>女</sex>
</student>
</students>
现在是我们自己定义规范里面爱咋写咋写,这样我们一个XML就写完了,如果还想加也可以加,爱咋写咋写,属性也是一样的爱咋写咋写,这就是一个XML文档。不过读的时候,要根据这个结构来读。
XML文档的解析
XML文档的解析通常来说有两种方式:
DOM:Document Object Model(文档对象模型)
具有代表性的工具包:JDOM , DOM4J , Jsoup(html)
1.将XML文档全部加载到内存中,形成一棵DOM树
2.通过DOM树来操作XML文档
3.优点:可以随机访问,方便修改
4.缺点:占用内存,速度慢
SAX:Simple API for XML(XML的简单API)
具有代表性的工具包:DOM4J
1.逐行读取XML文档,并且触发事件(以事件的方式进行触发)
2.优点:速度快,占用内存少
3.缺点:只能读取,不能修改(读完之后不能回头来读所以不能改)
DOM4J示例
先来导个包
<dependencies>
<!-- 日志门面用来生成日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.36</version>
</dependency>
<!-- lombok工具包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<!-- dom4j包用来解析XML-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
</dependencies>
首先的有一个XML文件给我们解析,这是我的放在resource目录下的students.xml
<?xml version="1.0" encoding="GBK" ?>
<students>
<student id="1">
<name>张三</name>
<age>20</age>
<sex>男</sex>
</student>
<student id="2">
<name>李四</name>
<age>20</age>
<sex>女</sex>
</student>
</students>
这是我的测试代码
package cn.wmm.xml;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.xml.parsers.SAXParser;
import java.util.List;
@Slf4j
public class Test {
@SneakyThrows//lombok注解,自动抛出异常
public static void main(String[] args) {
//创建读取器
SAXReader reader = new SAXReader();
//读取xml文档,返回Document对象,文件可能不存在,可能不是xml文件,可能不符合xml规范,会有异常
Document doc = reader.read(ClassLoader.getSystemResourceAsStream("students.xml"));
//获取根节点,在xml中所有的东西都是节点,里面可以输入节点,起到一个过滤的效果
Element rootElement = doc.getRootElement();
log.info(rootElement.getName());
//获取根节点下的子节点(根节点的名称)
List<Element>elements=rootElement.elements();
//遍历子节点的名称
for (Element element : elements) {
//获取子节点的属性值
Attribute attribute = element.attribute("id");
//获取子节点的名称
log.info("{} - {}",element.getName(),attribute.getValue());
List<Element>list=element.elements();
for (Element element1 : list) {
log.info("{} - {}",element1.getName(),element1.getText());
}
}
}
}
以日志的方式在控制台打印了根节点的名字
这是运行结果XML文件的结构就出来了,这就是XML的基本读法。
因为我是用日志输出的,日志文件的配置也发一下,在resource目录下创建log4j.properties,必须要是这个名字,或者用xml的方式配置也行,我这里是用的properties的形式,好记一点,配置代码如下
#log4j.rootLogger=根日志级别,appender列表(用逗号隔开)
log4j.rootLogger=INFO,liuyunheyue
#控制台输出的相关设置
#指定appender的名称,这个名称可以随便取,但是后面的logger中要用到
#配置appender的权限类名
log4j.appender.liuyunheyue=org.apache.log4j.ConsoleAppender
#配置用谁输出,默认是System.out可以不用配
log4j.appender.liuyunheyue.Target=System.out
#配置输出的格式,%d表示日期,%p表示日志级别,%m表示日志内容,%n表示换行
log4j.appender.liuyunheyue.layout=org.apache.log4j.PatternLayout
log4j.appender.liuyunheyue.layout.ConversionPattern=%d %p [%c] - %m%n
XML的定义:
有两种方式,一种是dtd(具有基本功能,语法简单)
另一种是schema(功能强大,可读性好),这是微软开发的一套定义语言。
xmlns:XML namespace (命名空间)
这里我们了解dtd就可以了,有兴趣的同学可以去了解schema
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>
]>
<students>
<student id="1">
<name>张三</name>
<age>20</age>
<sex>男</sex>
</student>
<student id="2">
<name>李四</name>
<age>20</age>
<sex>女</sex>
</student>
</students>
太累了,不懂私聊
工具包解析JDOM与DOM4J与JSOUP
DOM4j和JDOM都是用于处理XML文档的Java库,它们之间的关系可以总结如下
-
共同点:
- DOM4j和JDOM都是用于处理XML文档的Java库,它们都提供了一种更容易使用的API,以便于创建、解析和操作XML文档。
- 它们都采用了树型数据模型,允许将整个XML文档表示为树结构,其中每个XML元素都是树的一个节点。
- 它们都支持XPath,用于在XML文档中执行查询和导航操作。
- 两者都提供了对XML元素、属性、命名空间等基本XML结构的访问和操作方法。
-
区别:
- DOM4j是Apache基金会的项目,而JDOM是由JDOM项目组织开发和维护。这意味着它们有不同的开发和支持团队。
- DOM4j是性能更高、内存占用更小的库,特别适用于处理大型XML文档。它的设计目标是提供高性能和低内存开销。
- JDOM的设计目标是更容易使用和理解,因此在某些情况下可能更适合新手。它的性能通常被认为较低,因此对于处理大型文档可能不如DOM4j高效。
- DOM4j有更多的高级功能,如XML Schema验证、XSLT转换等,所以它在某些特定需求下更有优势。
- JDOM在某些方面更符合Java的编程模型,因此在Java社区中有一定的用户群体。
综上所述,DOM4j和JDOM都是处理XML的强大工具,选择使用哪个库通常取决于项目的具体需求和性能要求。如果你要有更高的性能和对高级XML功能的支持,就用DOM4j。如果你需要易用性和可读性,JDOM会更合适。一般来说大家都是用的DOM4J
另外一个就是JSOUP
Jsoup(发音为"jay-soup")是用于Java编程语言的开源HTML解析库。但是!!!,HTML是XML的子集,所以Jsoup也能用来也能用来解析XML。
可是可是但是,JSOUP提供的API主要是使开发者能够方便地从HTML文档中提取数据、操作HTML元素和执行Web抓取任务。Jsoup通常用于Web抓取、数据挖掘、数据提取、屏幕抓取以及HTML文档处理等任务,也就是我们所说的用来做网络爬虫
以下是Jsoup的一些主要功能和用法:
-
HTML解析和文档处理:Jsoup可以加载HTML文档并将其解析为一个文档对象,使你能够轻松地遍历、查询和操作HTML元素和属性。
-
选择器引擎:Jsoup内置了一个强大的CSS选择器引擎,允许你使用CSS选择器语法来选择HTML元素。这使得从HTML文档中提取特定数据变得非常简单。
-
数据提取:你可以使用Jsoup选择器来从HTML文档中提取特定的文本、链接、图像等信息。
-
HTML清洗:Jsoup可以用于清洗HTML文档,去除不需要的标签或属性,从而获得更干净的内容。
-
Web抓取:Jsoup可以用于创建网络请求,发送HTTP请求,获取HTML响应,并对其进行解析和处理。这使得它成为一个强大的Web抓取工具。
-
HTML生成:你还可以使用Jsoup创建HTML文档,添加元素、属性和文本内容,然后将其保存为HTML文件。
-
处理错误容忍度:Jsoup具有处理错误容忍度的能力,可以在解析不完整或破损的HTML时保持稳定。
-
支持国际化:Jsoup支持处理多种字符编码和国际化文本。
Jsoup是一款非常流行的HTML解析库,适用于各种Java项目,包括Web抓取器、爬虫、数据分析工具以及Web应用程序。如果你需要在Java中处理HTML文档或执行Web抓取任务,Jsoup是一个强大且易于使用的选择。它提供了广泛的文档和示例,可帮助你入门并掌握其用法。
想了解的同学可以移步我的JSOUP解析