xml简介
xml的全称是eXtensible Markup Language 即可扩展标记语言。
特点是可扩展,里面的标签都是自定义的。
xml的主要作用就是简单数据的存储,可以用来做配置文件,也可以使用xml做数据传输。
xml语法
xml语法是严格的,区分大小写的
-
文档声明:
必须写在xml文档的第一行。- 写法:<?xml version="1.0" ?>
- 属性:
- version:版本号 固定值 1.0
- encoding:指定文档的码表。默认值为 iso-8859-1
- standalone:指定文档是否独立 yes 或 no
-
元素:xml文档中的标签
文档中必须有且只能有一个根元素- 元素需要正确闭合
- 元素需要正确嵌套
- 元素名称要遵守:
- 元素名称区分大小写
- 数字不能开头
-
文本:
转义字符:>- CDATA: 里边的数据会原样显示
- <![CDATA[ 数据内容 ]]>
- CDATA: 里边的数据会原样显示
-
属性:
属性值必须用引号引起来。单双引号都行 - 注释:
xml示例:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1001">
<name>java编程入门</name>
<price>50</price>
</book>
<book>
<name>java高级编程</name>
<price>50<30</price>
<![CDATA[
if(5>3&&3<6)<abc></abc>
]]>
</book>
<book>
<name>java之道</name>
<price>80</price>
</book>
<book>
<name>颈椎病康复指南</name>
<price>20</price>
</book>
</books>
html与xml的区别
- html语法松散,xml语法严格
- html做页面展示,xml做数据存储
- html所有标签都是预定义的,xml所有标签都是自定义的
xml解析思想
数据存储在xml文件中,如果想要将其读取到java内存中,这时就需要对xml进行解析,解析xml有下面两个思想:
- dom
dom会将xml文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为对象。- 优点:可以对dom树进行增删改查。
- 缺点:dom树非常占内存,解析速度慢。
- sax
逐行读取,基于事件驱动- 优点:不占内存,速度快
- 缺点:只能读取,不能回写
xml常用解析器
- JAXP:sun公司提供的解析器,支持dom和sax,不过使用的不多。
- JDOM
- DOM4J:全称是dom for java,是jdom的升级版,性能优异,使用较为广泛。
这里主要介绍dom4j的使用方式,首先下载dom4j相关的jar包:
http://pan.baidu.com/s/1kVeKBQJ
下载后解压,将里面的dom4j-1.6.1.jar文件拷贝到web项目中的lib文件夹下。
代码示例,这里来读取之前写的book.xml文件:
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
* 使用dom4j解析文件
*
*/
public class Dom4jTest01 {
/*
* 得到某个具体的节点内容:第3本书的书名--》java之道
*/
@Test
public void test1() throws DocumentException {
// 创建一个xml解析对象
SAXReader reader = new SAXReader();
// 把xml文档加载到document对象中
Document document = reader.read("src/book.xml");
//获取根节点
Element root = document.getRootElement();
// 得到当前节点的所有子节点
List list = root.elements();
// 得到第三本书对象
Element thirdBook = (Element) list.get(2);
// 得到当前节点的文本内容
String name = thirdBook.element("name").getText();
System.out.println(name);
}
/*
* // 遍历所有元素节点
*/
@Test
public void test2() throws DocumentException {
// 创建一个xml解析对象
SAXReader reader = new SAXReader();
// 把xml文档加载到document对象中
Document document = reader.read("src/book.xml");
Element root = document.getRootElement();
treeSelect(root);
}
//递归
private void treeSelect(Element ele) {
// 输出当前节点的名子
System.out.println(ele.getName());
// ele.nodeCount()得到当前节点的所有子节点的数量
for (int i = 0; i < ele.nodeCount(); i++) {
// 取出下标为i的节点
Node node = ele.node(i);
// 判断当前节点是否为标签
if (node instanceof Element) {
// 把node强转为标签(Element)
treeSelect((Element) node);
} else {
System.out.println(node.getText());
}
}
}
}