XML
1.XML简介
- 1,什么是XML
- eXtensible Markup Language可扩展标记型语言.
- 标记型语言: html也是标记型语言,都是使用标签进行操作.xml里面的操作也是使用标签进行操作.
- 可扩展: html里面的标签,每个标签都有自己特定的含义,eg:< br/>,< hr/>等,但是在xml里面标签可以自己定义,eg:< aa>< /aa>,< name>< /name>等
- xml的主要功能是存储数据,(html是显示数据).
- xml的版本有1.0,1.1,一般使用1.0版本,它可以向下兼容.
- 2,xml的应用
- 一般用在三个地方:
- 系统之间传输数据的格式
- 表示生活中有关系的数据
- 系统的配置文件
2.xml语法
- 2.1 xml文档声明(必须第一行第一列)
- < ?xml version = ‘1.0’ encoding = ‘utf-8’ standalone = ‘yes’?>
- 2.2 xml元素的定义:
- xml中定义的标签,得又开始标签和结束标签.
- 有的标签没有内容,就在标签内结束eg:< aa/>.
- xml标签可以嵌套,但必须合理签到< a>< b>< /b>< /a>.
- 一个xml必须有且只能有一个根标签
- 命名规范:
- 区分大小写
- 不能以数字或者下划线开头,不能以xml开头(Xml…)
- 在标签中不能有空格
- 标签中间不能有冒号”:”
- 2.3 xml属性的定义:
- 在xml标签里面可以有多个属性,但是属性名称不能相同(这不是废话吗).
- 属性和属性值之间需要用”=”隔开,属性值用引号引住.”属性值”.
- 属性名称的命名规范与元素命名规范一样.
- 2.4 xml注释:
- 2.5 xml的CDATA区域
3.XML解析简介
- 3.1xml解析方法分类
- 第一种:dom解析–根据xml层级结构,在内存分配树形结构.
- 优点:很方便的实现增加,修改,删除扥操作
- 缺点:如果解析的文件过大,可能造成内存溢出
- 第二种:sax解析:–边读边解析
- 优点:不会造成内存溢出
- 缺点:不能实现增加,修改,删除的操作
- 第三种:pull解析
- 首先导入pull的jar包(两个1.KXML2-2.3.0jar,2.xmlpull_1_1_3_4c.jar)
- 创建解析器工厂
- 创建解析器
- 创建需要解析文件的输入流
- 把文件放到解析器里面
- 把(集合)里面的数据写到xml文件中(序列化factory.xmlserilizable)
- 创建解析器工厂
- 创建序列器
- 创建序列的输出流
- 把文件放到序列器
- 开始序列化.代码如下:
> 解析xml:
package com.heima.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.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class TestPull02 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 创建解析器工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 根据工厂获得解析器
XmlPullParser parser = factory.newPullParser();
// 创建文件io流
InputStream in = new FileInputStream("src/stu.xml");
// 把文件放到解析器里面
parser.setInput(in, "utf-8");
// 开始解析
int type = 0;
List 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();
}else if("student".equals(tagname)){
student = new Student();
}else if("name".equals(tagname)){
String name = parser.nextText();
student.setName(name);
}else if("age".equals(tagname)){
String age = parser.nextText();
student.setAge(age);
}
break;
case XmlPullParser.END_TAG:
//当解析到结束时,把对象放到list里面
if("student".equals(tagname)){
list.add(student);
}
break;
default:
break;
}
//向下执行
parser.next();
}
for (Student s : list) {
System.out.println(s);
}
}
-----------------------------------------------
xml序列化
package com.heima.seri;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import com.heima.pull.Persons;
public class TestPull3 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Persons s = new Persons();
s.setName("燕青");
s.setAge("22");
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();
OutputStream os = new FileOutputStream("src/person1.xml");
serializer.setOutput(os,"utf-8");
serializer.startDocument(null, true);
serializer.startTag(null, "persons");
serializer.startTag(null, "person");
serializer.startTag(null, "name");
serializer.text(s.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(s.getAge());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
serializer.endTag(null, "persons");
serializer.endDocument();
}
}