JavaWeb学习总结(五)XML
一、XML简介
(一)什么是XML
- 可扩展标记语言(EXtensible Markup Language),标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
(二)XML和HTML的区别
- XML 不是 HTML 的替代。
- XML 和 HTML 为不同的目的而设计:
- XML 被设计为传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
- HTML 旨在显示信息,而 XML 旨在传输信息。
二、XML作用
- 用来保存数据,而且这些数据具有自我描述性
- 它还可以作为项目或者模块的配置文件
- 还可以作为网络传输数据的格式(但现在以 JSON 为主)
三、XML语法
(一)文档声明
首先我们可以在IDEA中new一个File,并将后缀名改为.xml,例如books.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--XML 标签没有被预定义。您需要自行定义标签-->
<books>
<book id="SN145451221455"><!-- book 标签描述一本图书 id 属性描述 的是图书 的编号 -->
<name>Java从入门到放弃</name><!-- name 标签描述 的是图书 的信息 -->
<author>小明</author><!-- author 单词是作者的意思 ,描述图书作者 -->
<price>9.9</price><!-- price 单词是价格,描述的是图书 的价格 -->
</book>
<book id="SN15556512122">
<name>葵花宝典</name>
<author>小刚</author>
<price>8.8</price>
</book>
</books>
- xml 声明是xml文件
- version 是版本号
- encoding 是 xml 的文件编码
- standalone=“yes/no” 表示这个 xml 文件是否是独立的 xml 文件
- 而且这个
<?xml
要连在一起写,不能有空格否则会有报错
XML文件可以被浏览器打开:
(二)注释
XML和 html 注释 一样 : <!-- 注释 -->
(三)元素(标签)
1.什么是XML元素
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
在上例中,<books>
和<book>
都拥有元素内容,因为它们包含了其他元素。<author>
只有文本内容,因为它仅包含文本。
2.XML命名规则
(1)XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符
例如:
<book id="SN213412341"> <!-- 描述一本书 -->
<author>班导</author> <!-- 描述书的作者信息 -->
<name>java 编程思想</name> <!-- 书名 -->
<price>9.9</price> <!-- 价格 -->
</book>
注意:
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 “XML”、“Xml”)开始
- 标签名不能包含空格
- XML标签对大小写敏感
(2)XML中的标签(元素)也分为单标签和双标签
单标签格式:<标签名 属性=”值” 属性=”值” ...... />
双标签格式:< 标签名 属性=”值” 属性=”值” ......>文本数据或子标签</标签名>
注意:XML元素如果是双标签,则必须有闭合标签
(3)XML 中的特殊字符
假如我标签中的文本内容想显示<>
,但它们又是表示标签的符号,该怎么办呢?
这里就要使用到特殊字符,类似HTML
(4)XML 文档必须有根元素
根元素就是顶级元素, 没有父标签的元素,就叫顶级元素。
根元素只有唯一一个
例如上例中<books></books>
就是根元素,如果再写一个<books></books>
会报错
(四)属性
- XML的标签属性和HTML的标签属性是非常类似的,属性可以提供元素的额外信息
- 一个标签上可以书写多个属性。 属性的规则和标签的书写规则一致
- 属性值必须被引号包围,不过单引号和双引号均可使用。比如一个人的性别,person标签可以这样写:
<person sex="female">
或者这样也可以:<person sex='female'>
- 属性通常提供不属于数据组成部分的信息。在下面的例子中,文件类型与数据无关,但是对需要处理这个元素的软件来说却很重要,例如:
<file type="gif">computer.gif</file>
(五)文本区域(CDATA区)
CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要进行 xml 语法解析,通常CDATA区用于放有特殊符号的文本。
CDATA 格式: <![CDATA[内容]]>
四、dom4j 解析技术
(一)XML解析技术介绍
- 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 W3C 组织制定的 dom 技术来解析。
- document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)
- 早期 JDK 为我们提供了两种 xml 解析技术 dom 和 Sax (已经过时,但我们需要知道这两种技术)
- dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析标记也做了实现。
- sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML )
- SAX 解析,它跟 W3C 制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。
它是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。
所以它在解析 xml 的时候,在内存的使用上和性能上,都优于 dom 解析。 - 第三方的解析:
jdom 在 dom 基础上进行了封装 。
dom4j 又对 jdom 进行了封装。
pull 主要用在 Android 手机开发,跟SAX非常类似都是事件机制解析 xml 文件。
这个 dom4j 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。
(二)dom4j 类库的使用
需要到 dom4j 官网或者 Maven 下载 dom4j 的 jar 包
解压以后:
我们可以在docs文件夹中找到dom4j的学习文档:index.html
创建一个 lib 目录,并添加 dom4j 的 jar 包。并添加到类路径。
(三)dom4j 编程
1.使用dom4j读取XML文件得到Document对象
books.xml:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book sn="SN12341232">
<name>辟邪剑谱</name>
<price>9.9</price>
<author>班主任</author>
</book>
<book sn="SN12341231">
<name>葵花宝典</name>
<price>99.99</price>
<author>班长</author>
</book>
</books>
对应的Books实体类:
public class Book {
private String name;
private String sn;
private String author;
private double price;
public Book() {
}
public Book(String name, String sn, String author, double price) {
this.name = name;
this.sn = sn;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", sn='" + sn + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
dom4j测试类:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class dom4jTest {
public static void main(String[] args) throws DocumentException {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("xml/books.xml");
System.out.println(document);
}
}
2.使用dom4j解析XML文件所有元素
第一步: 先加载XML文件创建 Document 对象
第二步:通过 Document 对象拿到根元素对象
第三步:通过根元素.elements(标签名); 可以返回一个集合,这个集合里放着所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应的操作
import com.fox.bean.Book;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class dom4jTest {
public static void main(String[] args) throws Exception {
//1、创建一个SAXReader输入流,去读取XML配置文件,生成Document对象
SAXReader saxReader = new SAXReader();
//2、读取books.xml文件
//相对路径是从模块名开始算
Document document = saxReader.read("xml/books.xml");
//3、通过Document对象获取根元素
Element rootElement = document.getRootElement();
//4、通过根元素获取book标签对象
//element()和elements()都是通过标签名查找子元素,返回值不同
List<Element> books = rootElement.elements("book");
//5、遍历,处理每个book标签转换为Book实体类
for (Element book : books) {
//asXML()把标签对象转换回标签字符串
//System.out.println(book.asXML());
Element name = book.element("name");
//getText()可以获取标签中的文本内容
String nameText = name.getText();
//elementText()直接获取标签名的文本内容
String priceText = book.elementText("price");
String authorText = book.elementText("author");
//attributeValue()可以获取属性值
String sn = book.attributeValue("sn");
System.out.println(new Book(nameText,sn,authorText,Double.parseDouble(priceText)));
}
}
}