1.XML
a.xml的简介
i.什么是xml:eXtensible Markup Language,可扩展标记型语言(1)标记型语言:html是标记型语言,都是使用标签进行操作。
xml里面的操作也是使用标签进行操作。
(2)可扩展:html里面的标签,每个标签有自己特定的含义,比如<br/> <hr/>,
在xml中标签自己定义的,比如 <aa> <猫>
(3)xml的主要的功能是存储数据(不是显示数据)
(4)xml的版本 1.0 1.1 ,一般使用的是 1.0版本
ii. xml的应用
(1)xml的应用在三个地方
第一,xml用于作为系统之间传输数据的格式
第二,xml用于表示生活中有关系的数据
第三,xml经常使用在系统的配置文件
b.xml的文档声明
(1)如果创建xml文件,在xml中必须要有一个文档声明(2)写法: <?xml version="1.0" encoding="utf-8"?>
version : 必须要有,xml的版本 ,一般使用1.0
encoding:可选的,xml的编码方式
standalone:可选的,xml是否依赖其他文件 yes no
(3)注意:文档声明需要放在xml文件的第一行第一列
2.xml的解析简介
(a)xml解析的分类
(1)解析xml有三种方式第一种方式:dom解析
第二种方式:sax解析
第三种方式:pull解析
(b)dom解析xml
(1)根据xml的层级结构在内存中分配一个树形结构,document :代表整个文档
element:代表元素对象(标签)
属性对象
文本对象
node节点对象,是上面对象的父对象
(2)dom解析xml的优点:
因为分配了一个树形结构,很方便的实现增加 修改 删除的操作
(3)dom解析xml的缺点:
如果要解析的文件过大,一次性在内存中分配一个树形结构,造成内存的溢出
(c)sax解析xml
(1)sax解析的方式:边读边解析当使用sax方式读到特定的标签时候,自动调用相应的方法进行操作
(2)sax解析xml的优点:
不会造成内存的溢出
(3)sax解析xml的缺点:
不能实现增加 修改 删除的操作
(d)pull解析xml
首先,导入pull的jar包(两个jar包)(1)使用pull解析xml文件把xml中的内容放到集合里面
步骤:
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、把要操作的文件放到解析器里面
package cn.itcast.pull;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
public class TestPull01 {
/**
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、把要操作的文件放到解析器里面
*/
public static void main(String[] args) throws Exception {
//创建解析器工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//根据工厂创建解析器
XmlPullParser parser = factory.newPullParser();
//得到要操作文件的输入流
InputStream in = new FileInputStream("src/stu.xml");
//把要操作的文件放到解析器里面
parser.setInput(in, "utf-8");
//开始解析
int type = 0;
List<Student> list = null;
Student student = null;
//如果当前解析到的标签,不是文档的结束,继续操作
while((type=parser.getEventType())!=XmlPullParser.END_DOCUMENT) {
//得到当前解析的标签的名称
String tagName = parser.getName();
/*
* 1、如果解析到students ,创建list集合
* 2、如果解析到student,创建student对象
* 3、如果解析到name和age,获取标签里面内容
* 4、把内容放到student对象里面
* */
switch(type) {
case XmlPullParser.START_TAG:
if("students".equals(tagName)) {
//创建list集合
list = new ArrayList<Student>();
} else if("student".equals(tagName)) {
student = new Student();
} else if("name".equals(tagName)) {
//得到标签里面的值
String name = parser.nextText();
//把name值放到对象里面
student.setName(name);
} else if("age".equals(tagName)) {
String age = parser.nextText();
student.setAge(age);
}
break;
case XmlPullParser.END_TAG:
//当解析到结束的student时候,把对象放到list里面
if("/students".equals(tagName)) {
list.add(student);
}
break;
}
//向下执行
parser.next();
}
//遍历list集合
for (Student stu : list) {
System.out.println(stu.toString());
}
}
}
(2)把集合(对象)里面的数据写到xml文件中(序列化)
package cn.itcast.pull;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
public class TestPull {
/**
* 把对象里面的数据写到本地的xml文件中
*
* 1、创建解析器工厂
* 2、根据工厂创建解析器
* 3、设置文件的地址
* @throws XmlPullParserException
*/
public static void main(String[] args) throws Exception {
//创建对象
Student stu = new Student();
stu.setName("zhangsan");
stu.setAge("200");
//创建解析器工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//根据工厂创建解析器
XmlSerializer serializer = factory.newSerializer();
OutputStream out = new FileOutputStream("i:\\stu.xml");
//设置文件的地址
serializer.setOutput(out, "utf-8");
//把stu对象里面的数据 写到本地的xml文件中
serializer.startDocument(null, true);
//生成开始students标签
serializer.startTag(null, "students");
//生成开始和结束的student标签
serializer.startTag(null, "student");
//生成name和age标签
serializer.startTag(null, "name");
//写入name的值
serializer.text(stu.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(stu.getAge());
serializer.endTag(null, "age");
serializer.endTag(null, "student");
//生成结束students标签
serializer.endTag(null, "students");
serializer.endDocument();
}
}