什么是xml?
xml是可扩展的标记性语言
xml的作用?
1.可以用来保存数据,而且这些数据具有自我 描述性
2.它还可以作为项目或者模块的配置文件 (spring框架的配置文件application.xml等)
3.还可以作为网络数据传输的数据格式(现在以JSON为主)
声明文档
我们先创建一个简单的xml文件,用来描述图书信息
<books>
<book sn="SN123123">
<name>java入门name>
<author>小二author>
<price>68.9price>
book>
<book sn="SN123123">
<name>c语言入门name>
<author>小三author>
<price>16.8price>
book>
books>
xml注释
html和xml注释一样 :<!-- 注释-->
什么是xml元素?
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
元素可以包含其他元素、文本,元素也可以拥有属性
例如:
java入门
这就是元素
xml命名规则:
<book sn="SN123123">
<name>java入门name>
<author>小二author>
<price>68.9price>
book>
2.名称不能以数字或者标点符号开始
错误示例:
<1book sn="SN123123">
<name>c语言入门name>
<author>小三author>
<price>16.8price>
1book>
3.名称不能包含空格
错误示例
<he llo></he llo>
xml的属性标签和html的标签属性是非常类似的,属性可以提供元素的额外信息
在标签上可以书写属性:
一个标签上可以书写多个属性 每个属性必须使用引号引起来
规则和标签的书写一致
例:
<book sn="SN123123" value="book" id="java">
book>
语法规则
1.所有xml元素都必须有关闭标签(也就是闭合)
2.xml必须正确的嵌套
这就是不正确的嵌套
<book sn="SN123123" value="book" id="java">
<author>小三
book>author>
3.xml文档必须有根元素
根元素就是顶级元素 没有父标签的元素,叫顶级元素 。
根元素是没有父标签的顶级元素,而且是唯一一个才行
错误示例: 有两个books不可以
<books>
<book sn="SN123123">
<name>java入门name>
<author>小二author>
<price>68.9price>
book>
books>
<books>
<book sn="SN123123" value="book" id="java">
<name>c++语言入门name>
<author>小四author>
<price>16.8price>
book>
books>
4.xml的属性值必须加引号
5.xml中的特殊字符需要转义使用
例:
<price><16.8price>
需写成
<price><16.8price> < 转成 < > 转成 >
CDATA语法可以告诉xml解析器,我CDATA中的文本内容只是纯文本,不需要xml语法解析
CDATA格式
<book sn="SN123123" value="book" id="java">
<name>c语言入门name>
<author>小三author>
<price><16.8price>
book>
不管是html还是xml都是标记性文档,都可以使用w3c组织制定的dom技术来解析。
xml文档对象模型定义访问和操作xml文档的标准方法。
Dom将xml文档作为一个树形结构,而树叶被定义为节点
document对象表示的是整个文档(可以是html文档也可以是xml文档)
早期JDK为我们提供两种解析xml技术DOM和Sax(已经过时)
dom解析是W3C组织制定的
SUN公司在JDK5对dom解析技术进行了升级:SAX(Simple API for XML)
SAX解析是一行一行读取不会产生大量的Dom对象 在内存和性能上优于Dom解析
第三方的解析:
jdom在dom基础上做了封装
dom4j又对jdom做了封装
pull主要用在Android手机开发
dom4j解析技术
属于第三方公司技术,使用需要到dom4j官网下载jar包。
简单使用:
引入dom4j 依赖
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
项目下创建xml文件
<books>
<book sn="SN123123">
<name>java入门name>
<author>小二author>
<price>68.9price>
book>
<book sn="SN123123" value="book" id="java">
<name>c语言入门name>
<author>小三author>
<price><16.8price>
book>
books>
创建一个pojo类
/**
* @create: 2022/1/14
* @author: Tony Stark
*/
public class Book {
private String sn;
private String name;
private BigDecimal price;
private String author;
public Book() {
}
public Book(String sn, String name, BigDecimal price, String author) {
this.sn = sn;
this.name = name;
this.price = price;
this.author = author;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"sn='" + sn + '\'' +
", name='" + name + '\'' +
", price=" + price +
", author='" + author + '\'' +
'}';
}
}
测试方法
/**
* 读取books.xml文件生成Book类
*/
@Test
public void test2(){
Document read=null;
Element rootElement=null;
//1.读取books.xml文件
SAXReader reader = new SAXReader();
try {
read = reader.read("books.xml");
//2.通过Document对象获取根元素
rootElement = read.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}
//3.通过根元素获取book标签对象
//如果有多个就用elements 一个就用element
List<Element> books = rootElement.elements("book");
//4.遍历,处理每个book便签转换为book类
for (Element book : books) {
//asXML 把标签对象转换成标签字符串
// System.out.println(book.asXML());
Element name = book.element("name");
Element price = book.element("price");
Element author = book.element("author");
//getText可以获取标签中的文本
String nameText = name.getText();
String priceText = price.getText();
String authorText = author.getText();
//获取标签的属性值
String sn = book.attributeValue("sn");
System.out.println(new Book(sn,nameText,new BigDecimal(priceText),authorText));
}
}
输出
Book{sn='SN123123', name='java入门', price=68.9, author='小二'}
Book{sn='SN123123', name='c语言入门', price=16.8, author='小三'}