目录
XML的特点和使用场景
- 一是纯文本,默认使用UTF-8编码;二时可嵌套的;
- 如果把XML内容存为文件,那么它就是一个XML文件
- XML的使用场景:XML内容经常被当成消息进行网络传输,或者作为配置文件用于存储系统的信息。
XML文件的创建
就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml
XML的语法规则:
xml文件的后缀名为:.xml
文档声明必须时第一行
<?xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码
XML的标签规则:
- 标签由一对尖括号和合法标识组成:<name></name>,必须存在一个根标签,有且只有一个
- 标签必须成对存在,又开始,有结束
- 特殊标签可以不成对,但是必须有结束标记<br/>
- 标签中可以定义属性,属性和标签名空格隔开,属性值必须使用引号:<studengt id = "1"></name>
- 标签需要正确的嵌套
<student id="1">
<name>张三</name>
</student>
XML的其他组成
- XML文件中可以定义注释信息:<!- 注释内容 -->
- XML文件中可以存在以下特殊字
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
什么是文档约束
文档约束:是用来限定xml文件中的标签以及属性一个怎么写。
文档约束的分类
DTD
schema
XML文档约束-DTD的使用(了解)
需求:利用DTD文档约束,约束一个XML文件的编写
分析:
1.编写DTD约束文档,后缀必须是.dtd
2.在需要编写的XML文件中导入该DTD约束文档
3.按照约束的规定编写XML文件的内容
XML文档约束-schema的使用(了解)
1.schema可以约束具体的数据类型,约束能力上更强大。
2.schema本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加谨慎
需求:利用schema文件约束,约束一个XML文件的编写
分析:
1.编写schema约束文档,后缀必须是.xsd,具体的形式到代码中观看
2.在需要编写的XML文件中导入该schema约束文档
3.按照约束内容编写XML文件的标签
XML VS HTML
都是w3c这个组织下的两个产品, 最主要的功能就是储存和数据传输
HTML 现广泛用于web方面
标签固定的且有语义(标签名称不能自定义)
语法不严格(不写头标签也没有影响)
XML 现广泛用于数据配置方面
标签完全自定义(与HTTP不同)
语法非常严格
什么是XML解析
使用程序读取XML中的数据
两种解析方式
DOM解析
SAX解析
- DOM解析
- 解析XML时 生成一个DOM(document)树我们就可以对树中的内容进行任意的访问和修改
- 缺点:如果文档中的内容过多或层次过多,则生成出来的树也就越大,内存占用率也就越高
- 优点:任意访问和修改(可增删)
- SAX解析
- 针对于DOM解析而言是一种更快速、更高效的解析方式,主要用树遍历算法来进行节点访问。需要到哪里,只需要遍历该路径上的节点即可。
- 缺点:并不知道生成树的全貌, 所有不能增删(边读边解析、不能确定下面还有没有元素)
- 优点:更快速、更高效、省内存
DOM常见的解析工具
使用Dom4J解析出XML文件
需求:使用Dom4J把一个XMl文件的数据进行解析
分析:
- 下载Dom4J框架,官网下载(dom4j),下载.jar文件
- 在项目中创建一个文件加:lib
- 将dom4j-2.1.1.jar文件复制到lib文件中
- 在jar文件上点击右键,选择Build Path -> 点击 Add path...
- 在类中导包使用
Dom4J解析XML-得到Document对象
SAXReader类
构造方法 | 说明 |
public SAXReader() | 创建Dom4J的解析器对象 |
Document read(String url) | 加载XML文件成为Document 对象 |
Document类
方法名 | 说明 |
Element getRootElement() | 获得根元素对象 |
Dom4J中的常用方法
方法名 | 说明 |
List<Element> elements() | 得到当前元素下的所有元素 |
List<Element> elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
Element elements(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
String getName() | 得到元素名字 |
String attributeValue(String name) | 通过属性名直接得到属性值 |
String elementText(子元素名) | 得到指定名称的子元素的文本 |
String getText() | 的到文本 |
代码演示:
在项目中创建一个xml文件
解析编码:
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4JDemo {
public static void main(String[] args) throws DocumentException {
//创建DOM4J解析器对象
SAXReader reader = new SAXReader();
//向解释器对象传入一个需要被解析的xml文件
//document就是xml文件的对象
Document document = reader.read(new File("users.xml"));
//获取xml文件中的根节点元素
Element root = document.getRootElement(); //此处根节点root=users
//获取root元素下的所有
List<Element> elements = root.elements();
//遍历节点中的的元素
for (Element element1 : elements) {
//遍历每一个节点的元素
// System.out.println(element.asXML());
//获取当前接节点的属性列表 输出: id:1 id:2 id:3
List<Attribute> att = element1.attributes();
// for (Attribute attbu : att) {
// System.out.println(attbu.getName() + ":" + attbu.getValue());
// }
//获取指定属性值
System.out.println("id"+":" + element1.attributeValue("id"));
//获取所有子元素
List<Element> ele = element1.elements();
for (Element elet : ele) {
System.out.println(elet.getName() + ":" + elet.getText());
}
System.out.println("==========");
//获取指定元素
System.out.println("name" + ":" + element1.element("name").getText());
}
}
}
运行结果比较多,这里就不展示了,感兴趣的朋友可以自己运行以下。
JSOUP解析
jsoup解析的特点:
不仅可以解析xml,也可以解析html
按照名称来获取我们的元素
- 其余安装步骤xDmo4J一样
- 将其放入项目的lib文件中
使用JSOUP解析:
直接上代码:
import java.io.File;
import java.io.IOException;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.jsoup.Jsoup;
public class JSOUPTest {
public static void main(String[] args) throws IOException {
//1.获取xml文件的document对象
//注意:此处Document类导入的是org.jsoup.nodes.Document,不敢导入Dom4J包下的
Document document = Jsoup.parse(new File("users.xml"), "utf-8");
//获取单一一个标签元素对象,只能通过id属性来获取在xml/html中,每一个标签都可以定义id属性但是值不能一样
// Element elementById = document.getElementById("1");
// //将id为“1”的标签的所有内容都打印出来了,(包括子标签的内容)
// System.out.println(elementById);
//获取所有名称为user的标签对象 elementsByTag本质上是一个列表
Elements elementsByTag = document.getElementsByTag("user");
//打印user的标签标签下的所有元素,两种获取方式
//1.将elementsByTag看成一个列表遍历输出
// for (Element element : elementsByTag) {
// System.out.println(element);
// }
//2.直接输出
System.out.println(elementsByTag);
}
}