目录
一、XML简介
1、什么是 xml ?
xml 是可扩展的标记行语言。
2、xml 的作用
(1)用来保存数据,而且这些数据具有自我描述性;
(2)作为项目或者模块的配置文件;
(3)作为网络传输数据的格式(JSON为主)。
二、XML的语法
1、文档声明
<?xml version="1.0" encoding="utf-8"?>
<!--
以上内容就是xml文件的声明:
version = 1.0 表示xml的版本
encoding = utf-8 表示xml文件本身的编码
-->
<books> <!-- books表示多个图书信息 -->
<book sn = "SN114514"> <!-- book表示一个图书信息 sn属性表示图书序列号 -->
<name>Java教程</name> <!-- name标签表示书名 -->
<author>我</author> <!-- 表示作者 -->
<price>3.14¥</price> <!-- 表示价格 -->
</book>
<book sn = "SN123456">
<name>Python教程</name>
<author>你</author>
<price>666¥</price>
</book>
</books>
2、XML注释
与 HTML 一样,使用 <!-- --> 进行注释。
3、元素(标签)
(1)什么是 XML 元素?
XML 元素是指,从开始标签到结束标签的内容。元素可以包含其他元素、文本或者两者的混合物,元素还可以拥有属性。
(2)元素命名规则
名称可以包含字母、数字、其他字符。
不能以特殊字符开头。
<?xml version="1.0" encoding="utf-8"?>
<books>
<图书 sn = "SN123456">
<name>Python教程</name>
<author>你</author>
<price>666¥</price>
</图书>
<book sn = "SN54351" name = "你好" author = "电棍" price = "114514"/>
</books>
4、XML属性
属性可以提供元素(标签)的额外信息。
5、XML 语法规则
(1)标签必须闭合;
(2)XML 对大小写敏感;
(3)XML 文档必须有根元素;
- 顶级元素:没有父标签的元素。
- 根元素:没有父标签的顶级元素。且唯一。
- 也就是上面的代码只能有一个 <books>。
(4)文本区域(CDATA区)
- CDATA 可以告诉 XML 解析器,CDATA 中的内容是纯文本,不要用 xml 语法去解析。
- 例如:大于号 >,用 CDATA 就不用写成 > 。
- 语法格式:<![CDATA[xxxxxxxxx]]>
<?xml version="1.0" encoding="utf-8"?>
<books>
<book sn = "SN123456">
<name>Python教程</name>
<author>
<![CDATA[这里就是纯文本内容]]>
</author>
<price>666¥</price>
</book>
</books>
三、XML解析技术
无论是 HTML 还是 XML 都是标记型文档,都可以使用 DOM 技术来解析。document 对象表示的是整个文档(可以是 HTML 文档,也可以是 XML 文档)。
其中,dom4j 是重点需要了解的。
1、引入 jar 包
创建一个 lib 目录,并在其中添加 jar 包。然后把 jar 包添加到库。
2、编写测试代码
package Test_Java;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
public class test_01 {
public static void main(String[] args) throws Exception {
// 创建一个 saxreader 输入流,去读取 xml 配置文件,生成 document 对象。
SAXReader saxreader = new SAXReader();
Document dom = saxreader.read("./JavaTest/xml/test_01.xml");
System.out.println(dom);
}
}
返回下面这种,说明测试成功。
3、解析 XML 文件
XML 文件(test_01.xml):
<?xml version="1.0" encoding="utf-8"?>
<books>
<book sn = "SN123456">
<name>Python教程</name>
<author>我</author>
<price>666¥</price>
</book>
<book sn = "SN114514">
<name>C++教程</name>
<author>你</author>
<price>666¥</price>
</book>
</books>
Java 文件(test_01.java):
package Test_Java;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class test_01 {
private String sn;
private String name;
private String author;
private String price;
public static void main(String[] args) {
// 创建一个 saxreader 输入流,去读取 xml 配置文件,生成 document 对象。
SAXReader saxreader = new SAXReader();
try {
Document dom = saxreader.read("./JavaTest/xml/test_01.xml");
// 通过 dom 对象获取 根元素。
Element rootElement = dom.getRootElement();
System.out.println(rootElement);
// 通过根元素获取book标签对象:
// element()和 elements()都是通过标签名查找子元素,有多个子元素要用 elements()
List<Element> books = rootElement.elements("book");
// 遍历,处理每个 book 标签转换为 Book 类
for (Element book : books) {
// asXML():把标签对象,转换为字符串
System.out.println("book标签内容:\n" + book.asXML() + "\n");
// attributeValue():获取当前元素属性值
String snValue = book.attributeValue("sn");
System.out.println("sn的属性值:\n" + snValue + "\n");
// 此时可以用 element() 来获得 book 的单个子元素
Element nameEle = book.element("name");
System.out.println("name子元素:\n" + nameEle.asXML() + "\n");
// getText() 可以获取文本内容
String nameText = nameEle.getText();
System.out.println("name内容:\n" + nameText + "\n");
System.out.println(new test_01(snValue, nameText, book.element("author").getText(), book.element("price").getText()));
}
} catch(Exception e) {
e.printStackTrace();
}
}
public test_01(String sn, String name, String author, String price) {
this.sn = sn;
this.name = name;
this.author = author;
this.price = price;
}
@Override
public String toString() {
return "test_01{" +
"sn='" + sn + '\'' +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price='" + price + '\'' +
'}';
}
}