XML简介
XML 指可扩展标记语言
XML的作用
①XML 被设计用来传输和存储数据,存储的数据具有自我描述性
②XML可以作为项目或者模块的配置文件
③XML可以作为网络传输数据的格式(目前以JSON为主)
<?xml version="1.0" encoding="UTF-8" ?>
<!--
<?xml version="1.0" encoding="UTF-8" ?>
是XML的声明,version表示XML的版本,encoding表示XML的文件本身的编码
-->
<books> <!-- 表示多个图书信息 -->
<book id="12345678"> <!-- 表示一个图书信息,id属性表示图书序列号 -->
<name>时间简史</name> <!-- 表示图书名称 -->
<price>12.6</price> <!-- 表示图书价格 -->
<author>霍金</author> <!-- 表示图书作者 -->
</book>
<book id="23456789">
<name>广义相对论</name>
<price>13.6</price>
<author>爱因斯坦</author>
</book>
<book id="34567891" name="量子力学" />
</books>
XML语法
①XML注释:<!-- xml注释 -->
②XML元素:是指从(且包括)开始标签到(且包括)结束标签的部分,元素可包含其他元素、文本或者两者的混合物,元素也可以拥有属性(元素是指从开始标签到结束标签的内容)
③XML命名规则:1)名称可以含字母、数字以及其它字符;2)名称不能以数字或者标点符号开始;3)名称不能包含空格
④XML中的元素(标签)也分成单标签和双标签
单标签格式:<标签名 属性="值" 属性="值"....../>
双标签格式:<标签名 属性="值" 属性="值"...>文本数据或子标签</标签名>
⑤XML属性:属性可以提供元素的额外信息,一个标签可以写多个属性。每个属性的值必须用引号引起来;
⑥XML语法规则:1)所有XML元素都必须有关闭标签;2)XML对大小写敏感;3)XML必须正确的被嵌套;4)XML文档必须有根元素(顶级元素,没有父标签的顶级元素,必须唯一);5)XML的属性值必须加引号;6)特殊字符必须使用与HTML相同形式书写(例如:<(<),>(>))7)CDATA格式:<![CDATA[这里输入的内容会原样显示,不会解析]]>
XML解析技术
XML DOM将XML文档作为一个树状结构,而树叶被定义为节点。
根元素 <books> | ||||
父↑ | ↓子 | ||||
属性: "fname" | 元素: <book> | — | 属性: "id" | |
↑ | ↓ | |||
← | 元素: <name> | 元素: <author> | ↔ 同级 | 元素: <price> |
文本: 时间简史 | 文本: 霍金 | 文本: 12.6 |
这种树结构被称为节点树。可通过这棵树访问所有节点。可以修改或删除它们的内容,也可以创建新的元素。这颗节点树展示了节点的集合,以及它们之间的联系。这棵树从根节点开始,然后在树的最低层级向文本节点长出枝条。
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book id="sn12345678">
<name>广义相对论</name>
<author>爱因斯坦</author>
<price>13.6</price>
</book>
<book id="sn23456789">
<name>狭义相对论</name>
<author>爱因斯坦</author>
<price>12.6</price>
</book>
<book id="sn34567891">
<name>时间简史</name>
<author>霍金</author>
<price>11.6</price>
</book>
</books>
package com.atNewWorld.pero;
public class Book {
private String Id;
private String name;
private String author;
private Double price;
public Book() {
}
public Book(String id, String name, String author, Double price) {
Id = id;
this.name = name;
this.author = author;
this.price = price;
}
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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{" +
"Id='" + Id + '\'' +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
package com.atNewWorld.pero;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jTest {
@Test
public void test() {
//创建一个SaxReader输入流读取XML配置文件生成Document对象
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/books.xml");
System.out.println(document);
} catch (Exception e) {
e.printStackTrace();
}
}
//读取books.xml文件生成book类
@Test
public void test01() {
//1.读取books.xml文件
SAXReader saxReader = new SAXReader();
try {
//2.通过Document对象获取根元素
Document document = saxReader.read("src/books.xml");
Element rootElement = document.getRootElement();
//3.通过根元素获取book标签对象
//element()和elements()都是通过标签名查找子元素
List<Element> books = rootElement.elements("book");
//4.遍历,处理每一个book标签转换为book对象
for (Element book : books) {
Element nameElement = book.element("name");
String nameText = nameElement.getText();
String priceText = book.elementText("price");
String authorText = book.elementText("author");
String idText = book.attributeValue("id");
System.out.println(new Book(idText,nameText,authorText,Double.parseDouble(priceText)));
}
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
}