文章目录
- 1、XML简介
- 2、xml语法
- 3、xml解析
- 4、Dom4j类库的使用
- 5、dom4j解析xml
1、XML简介
xml是可扩展的标记性语言,xml的主要作用有:
- 用来保存数据,而且这些数据具有自我描述性
- 做为项目或者模块的配置文件
- 做为网络传输数据的格式(现在以json为主)
2、xml语法
🍁xml元素
<?xml version="1.0" encoding="utf-8" ?>
<!--
以上为xml文件的声明
version="1.0" 表示xml的版本
encoding="utf-8" 表示xml文件本身的编码方式
-->
<books><!--books表示多个图书信息-->
<book sn="SN15731108123"> <!--book表示一个图书信息,sn属性表示图书的序列号-->
<name>时间简史</name> <!--name标签表示书名-->
<author>霍金</author>
<price>75</price>
</book>
<book sn="SN15731108456">
<name>JavaWeb</name>
<author>9527</author>
<price>99.9</price>
</book>
</books>
xml注释:
<!--和html一样-->
不同于html元素(标签),xml的元素可以自己定义,命名规则:
- 可以包含字母、数字以及其他字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符xml(或XML、Xml)开始(现在这条不限制了)
- 名称不能包含空格
xml也分单标签和双标签
<book name="Java" author="9527" />
和html一样,都有属性来提供元素的额外信息。
🍺需要注意的是:
xml文档必须有且只有一个根元素,根元素即没有父标签的元素。
🍁文本区域(CDATA区)
CDATA区里的文本内容,只是纯文本,不会被xml语法解析
语法:
<![CDATA[xxx]]>
举例:
<author>
<![CDATA[<<这里的小于号不被xml解析]]>
</author>
3、xml解析
和html一样,xml做为可扩展的标记性语言,也可以使用w3c组织制定的dom技术来解析。
document对象表示的是整个文档(可以是html,也可以是xml文档)
早期的JDK提供了两种xml解析技术:
- DOM
- Sax(即Simple API for XML),已过时
除了以上,还有第三方解析:
- jdom是在dom的基础上进行了封装
- dom4j又对jdom进行了封装
第三方解析需要使用第三方提供的类库。
4、Dom4j类库的使用
下载dom4j.jar:
①、进入此网址
②、进入网址后搜索dom4j:
下载到本地:
复制jar包到项目下,右键Add as Library…
5、dom4j解析xml
xml文件内容:
<?xml version="1.0" encoding="utf-8" ?>
<books>
<book sn="SN15731108123">
<name>时间简史</name>
<author>霍金</author>
<price>75</price>
</book>
<book sn="SN15731108456">
<name>JavaWeb</name>
<author>9527</author>
<price>99.9</price>
</book>
</books>
根据xml文件,定义Book类:
package com.code.book;
import java.math.BigDecimal;
public class Book {
private String sn;
private String name;
private double price;
private String author;
public Book(String sn, String name, double 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 double getPrice() {
return price;
}
public void setPrice(double 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 + '\'' +
'}';
}
}
定义解析成相关对象的方法:
import java.util.List;
public class Dom4jTest {
public static void main(String[] args) throws DocumentException {
new Dom4jTest().parse();
}
/**
* 读取books.xml文件生成book类
*/
public void parse() throws DocumentException {
//创建一个SaxReader输入流
SAXReader reader= new SAXReader();
//读取books.xml文件,生成Document对象
Document document = reader.read("xml/src/books.xml");
//通过Document对象获取根元素
Element rootElement = document.getRootElement();
System.out.println(rootElement);
//通过根元素获取book标签对象
//element和elements方法都是通过标签名查找子元素,有多个的时候用s
List<Element> bookList = rootElement.elements("book");
//遍历,将每个book标签转换为Book类
for(Element book : bookList){
//asXML方法是把标签对象转换为标签字符串
System.out.println(book.asXML());
//继续用element方法取子元素
Element nameElement = book.element("name");
//System.out.println(nameElement.asXML());
//getText方法可以获取标签中的文本内容
String nameText = nameElement.getText();
//也可直接使用elementText方法获取指定标签名的文本内容
String bookName = book.elementText("name");
String bookAuthor = book.elementText("author");
String bookPrice = book.elementText("price");
//获取标签属性值
String snValue = book.attributeValue("sn");
//从xml中拿到数据以后,new对象
Book bookObj = new Book(snValue,bookName,Double.parseDouble(bookPrice),bookAuthor);
System.out.println(bookObj);
}
}
}
运行效果:
🍁相关方法提取:
- getRootElement() 通过document对象获取根元素
- elements(“tagName”) 通过标签名查找子元素,有多个的时候用s
- asXML() 把标签对象转换为标签字符串
- getText() 获取标签中的文本内容
- elementText("tagName) 获取指定标签名的文本内容
- attributeValue(“key”) 获取标签属性值