一、简介
xml:可扩展的标记性语言
xml的作用:
- 用来保存数据,且这些数据具有自我描述性
- 项目或模块的配置文件
- 作为网络传输数据的格式(现在JSON为主)
二、xml语法及规则
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml 声明version 是版本的意思encoding 是编码-->
<books> <!-- 这是xml 注释-->
<book id="SN123123413241"> <!-- book 标签描述一本图书id 属性描述的是图书的编号-->
<name>java 编程思想</name> <!-- name 标签描述的是图书的信息-->
<author>华仔</author> <!-- author 单词是作者的意思,描述图书作者-->
<price>9.9</price> <!-- price 单词是价格,描述的是图书的价格-->
</book>
<book id="SN12341235123"> <!-- book 标签描述一本图书id 属性描述的是图书的编号-->
<name>葵花宝典</name> <!-- name 标签描述的是图书的信息-->
<author>班长</author> <!-- author 单词是作者的意思,描述图书作者-->
<price>5.5</price> <!-- price 单词是价格,描述的是图书的价格-->
</book>
</books>
xml元素是从开始标签到结束标签的部分
元素可以包含其他元素、文本,元素可以拥有属性
XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
元素也分单标签和双标签
XML的每个属性必须用引号引起来
XML标签必须闭合
XML标签对大小写敏感
XML标签要正确嵌套
xml文档必须有根元素,根元素就是顶级元素(没有父标签),且必须唯一
特殊字符:
>
<
文本区域(CDATA):
CDATA语法告诉xml解析器,内部数据为文本,不需要解析
<book sn="SN123" name="葵花宝典">
<![CDATA[
<<<>>>>
]]>
</book>
三、dom4j解析技术
html和xml都是标记性语言,都可以通过w3c组织指定的dom技术解析。
xml文档对象模型定义访问和操作xml的标准方法
DOM将XML文档作为一个树形结构,document对象表示整个文档
早期JDK 为我们提供了两种xml 解析技术DOM 和Sax
dom4j解析技术,属于第三方公司的技术。需要使用第三方给我们提供好的类库才可以解析xml 文件
简单例子:
将xml文件数据存入Book对象并打印
前提:需要导入dom4j的jar包
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--books.xml-->
<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>
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;
}
@Override
public String toString() {
return "Book{" +
"sn='" + sn + '\'' +
", name='" + name + '\'' +
", price=" + price +
", 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;
}
}
测试代码
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 Dem4jTest {
//@Test
//这个需要引入junit包
public void test(){
//创建SAXReader,读取xml文件
SAXReader saxReader=new SAXReader();
try {
//相对路径从模块名开始
Document document = saxReader.read("src/books.xml");
//通过document对象获取根元素
Element rootElement=document.getRootElement();
//System.out.println(rootElement);
//通过根元素获取book对象,通过标签名查找子元素
List<Element> books = rootElement.elements("book");
for(Element book:books){
//System.out.println(book.asXML());
Element nameElement=book.element("name");
String nameText=nameElement.getText();
String priceText = book.elementText("price");
String authorText = book.elementText("author");
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue,nameText,Double.parseDouble(priceText),authorText));
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
结果
Book{
sn='SN12341232', name='辟邪剑谱', price=9.9, author='班主任'}
Book{
sn='SN12341231', name='葵花宝典', price=99.99, author='班长'}