您的位置:首页 > 理论基础 > 计算机网络

XML解析

2016-05-19 22:25 567 查看
Android系统中的应用怎么和Windows服务器(IIS)进行交互数据?
Android系统的应用怎么和IOS系统中的应用交互数据

其它诸如此类跨平台、跨操作系统的数据交互问题可以通过XML解决

XML概述

可扩展性标记语言

XML用于描述数据

应用场:持久化存储数据;数据交换;数据配置

XML解析方式:

一、  DOM解析

二、 SAX解析

SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。

事件处理器:

ContentHandler、DTDHandler、ErrorHandler

通常用于查找、读取XML数据

SAX解析步骤:

1 创建工厂

2 使用工厂创建解析器

3 利用解析器得到reader

4 设置事件处理器

5 利用reader读取XML文档



案例一:解析学生对象

package com.qf.day29;

import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

/**
* 使用sax解析xml文件,并创建Book对象保存数据到集合中
* @author wgy
*
*/
public class SaxDemo3 {
public static void main(String[] args) throws Exception{
//1创建工厂
SAXParserFactory factory=SAXParserFactory.newInstance();
//2创建解析器
SAXParser parser=factory.newSAXParser();
//3获取读取器
XMLReader reader=parser.getXMLReader();
//4设置事件处理器
BookContentHandler handler=new BookContentHandler();
reader.setContentHandler(handler);
//5解析
reader.parse("books.xml");
//6遍历集合
for (Book b : handler.books) {
System.out.println(b.getId()+"---"+b.getBookname()+"--"+b.getAuthor()+"--"+b.getPrice());
}
}
}
/**
* 事件处理器
* @author wgy
*
*/
class BookContentHandler extends DefaultHandler{
ArrayList<Book> books;
Book book;
String currentTag;//当前的开始标签
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag=qName;//把当前读取的开始标签赋值给currentTag;
if(qName.equals("books")){
books=new ArrayList<Book>();//初始化集合
}
if(qName.equals("book")){
book=new Book();
int id=Integer.valueOf(attributes.getValue("id"));
book.setId(id);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentTag=""; //去掉换行和空格
if(qName.equals("book")){
books.add(book);
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(currentTag.equals("bookname")){
book.setBookname(new String(ch,start,length));
}
if(currentTag.equals("author")){
book.setAuthor(new String(ch,start,length));
}
if(currentTag.equals("price")){
double price=Double.valueOf(new String(ch,start,length));
book.setPrice(price);
}
}

}


三、PULL解析

Pull是Android内置的xml解析器。Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

案例1-PULL解析Book


package com.qf.day29_2;

import java.io.FileInputStream;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import com.qf.day29.Book;

/**
* 使用PUll解析books.xml
*
* @author wgy
*
*/
public class PullDemo1 {
public static void main(String[] args) throws Exception {
// 1创建工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2创建解析器
XmlPullParser parser = factory.newPullParser();
// 3设置要读取的文件
parser.setInput(new FileInputStream("books.xml"), "gbk");
// 4获取第一个事件类型编码 0开始文档 1 结束文档 2 开始标记 3 结束 标记
int type = parser.getEventType();
// 5 循环文件
ArrayList<Book> arrayList=null;
Book book=null;
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
String tagname=parser.getName();
if(tagname.equals("books")){
arrayList=new ArrayList<Book>();
}
if(tagname.equals("book")){
book=new Book();
//获取属性
int id=Integer.valueOf(parser.getAttributeValue(null, "id"));
book.setId(id);
}
if(tagname.equals("bookname")){
//nextText()读取标签内容
String bookname=parser.nextText();
book.setBookname(bookname);
}
if(tagname.equals("author")){
String author=parser.nextText();
book.setAuthor(author);
}
if(tagname.equals("price")){
double price=Double.valueOf(parser.nextText());
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG:
if(parser.getName().equals("book")){
arrayList.add(book);
}
System.out.println("---结束标记"+parser.getName());
break;
default:
break;
}

// 下一个事件类型编码
type = parser.next();
}
//遍历集合
for (Book b : arrayList) {
System.out.println(b.getId()+" "+b.getBookname()+" "+b.getAuthor()+" "+b.getPrice());

}

}
}

案例2-PULL解析学生信息

package com.qf.day29_3;

import java.io.FileInputStream;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

/**
* 使用PULL方式解析students.xml
*
* @author wgy
*
*/
public class PullStudent {
public static void main(String[] args) throws Exception {
// 1创建工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2创建解析器
XmlPullParser parser = factory.newPullParser();
// 3设置读取的文件
parser.setInput(new FileInputStream("student.xml"), "utf-8");
// 4获取第一个事件类型编码
int type = parser.getEventType();
// 5循环读取
ArrayList<Student> students=null;
Student stu=null;
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
String tag=parser.getName();
if(tag.equals("students")){
students=new ArrayList<Student>();
}
if(tag.equals("student")){
stu=new Student();
}
if(tag.equals("id")){
stu.setId(Integer.valueOf(parser.nextText()));
}
if(tag.equals("name")){
stu.setName(parser.nextText());
}
if(tag.equals("age")){
stu.setAge(Integer.valueOf(parser.nextText()));
}
if(tag.equals("sex")){
stu.setSex(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if(parser.getName().equals("student")){
students.add(stu);
}
break;

default:
break;
}
// 下一个
type = parser.next();
}
for (Student s : students) {
System.out.println(s.getId()+"---"+s.getName()+"---"+s.getAge()+"--"+s.getSex());
}
}
}

package com.qf.day29_3;

public class Student {
private int id;
private String name;
private int age;
private String sex;
public Student() {
// TODO Auto-generated constructor stub
}
public Student(int id, String name, int age, String sex) {
super();
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}

}<span style="font-size:24px;">
</span>

SAX和PULL比较

相同点:
PULL解析和SAX解析都使用了事件处理器机制
不同点:
SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。

pull多线程下载

package com.qf.Task3;

import java.io.InputStream;
import java.io.RandomAccessFile;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpDownload {
public static void main(String[] args) throws Exception{
String urlString = "http://localhost:8080/Day27Web/java.pdf";
String filePath = "d:\\java.pdf";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(urlString)
.build();
Response response = client.newCall(request).execute();

if (response.code()==200) {
long length =response.body().contentLength();
//System.out.println(length);
int sublen = (int) (length%4==0?length/4:length/4+1);
int lastlen = (int) (length-sublen);

downloadThread d1 = new downloadThread(0*sublen,sublen,urlString,filePath);
downloadThread d2 = new downloadThread(1*sublen,sublen,urlString,filePath);
downloadThread d3 = new downloadThread(2*sublen,sublen,urlString,filePath);
downloadThread d4 = new downloadThread(3*sublen,lastlen,urlString,filePath);
d1.start();
d2.start();
d3.start();
d4.start();
}
}
}

class downloadThread extends Thread {
private int skipCount;//跳过字节数
private int length;//下载长度
private String urlString;//服务器地址
private String filePath;//所存放的路径

public downloadThread(int skipCount,int lentgth,String urlString,String filePath) {
// TODO Auto-generated constructor stub
this.skipCount = skipCount;
this.length = lentgth;
this.urlString = urlString;
this.filePath = filePath;
}
@Override
public void run() {
// TODO Auto-generated method stub

try {

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(urlString)
.addHeader("Range", "bytes="+skipCount+"-"+(skipCount+length-1))
.build();
Response response = client.newCall(request).execute();
//System.out.println(response.code());
if (response.code()==206) {
System.out.println(Thread.currentThread().getName()+"开始下载");
InputStream is =response.body().byteStream();
RandomAccessFile raf = new RandomAccessFile(filePath,"rw");
raf.seek(skipCount);
byte[] buf = new byte[1024*4];
int len =0;
while((len = is.read(buf))!=-1){
raf.write(buf,0,len);
}
is.close();
raf.close();
System.out.println(Thread.currentThread().getName()+"下载完成");
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络 xml android 跨平台