解析网络 xml 流程

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 引用:http://www.cnblogs.com/boyupeng/archive/2011/04/06/2028529.html 这几天看了mars老师的文章,其中有一个利用sax解析从网络中下载的xml文件,很受用。

引用:http://www.cnblogs.com/boyupeng/archive/2011/04/06/2028529.html

这几天看了mars老师的文章,其中有一个利用sax解析从网络中下载的xml文件,很受用。先来看看工程的架构:

1

其中FileUtils.java用来放一些常用的公共方法,这里放置对文件的读写

      HttpDownload.java用来从网上下载xml文件

      MyContentHandler.java为xml内容处理器类

      XMLActivity.java这个大家懂得,呵呵

第一步,FileUtils.java,还是老样子,具体的解释放在代码注释中:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.os.Environment;

public class FileUtils
{
private String SDPATH;

public String getSDPATH()
{
return SDPATH;
}

public FileUtils()
{
//得到当前外部存储设备的目录/SDCARD
SDPATH = Environment.getExternalStorageDirectory() + "/";
}

/**
* 在SD卡上创建文件
*
*
@throws IOException
*/
public File creatSDFile(String fileName) throws IOException
{
File file = new File(SDPATH + fileName);
file.createNewFile();
return file;
}

/**
* 在SD卡上创建目录
*
*
@param dirName
*/
public File creatSDDir(String dirName)
{
File dir = new File(SDPATH + dirName);
dir.mkdir();
return dir;
}

/**
* 判断SD卡上的文件夹是否存在
*/
public boolean isFileExist(String fileName)
{
File file = new File(SDPATH + fileName);
return file.exists();
}

/**
* 将一个InputStream里面的数据写入到SD卡中
*/
public File write2SDFromInput(String path, String fileName,
InputStream input)
{
File file = null;
OutputStream output = null;
try
{
creatSDDir(path);
file = creatSDFile(path + fileName);
output = new FileOutputStream(file);
byte buffer[] = new byte[4 * 1024];
while ((input.read(buffer)) != -1)
{
output.write(buffer);
}
output.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
output.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
return file;
}

}



第二步,HttpDownload.java

package my.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpDownloader
{
private URL url = null;

/**
* 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
* 1.创建一个URL对象
* 2.通过URL对象,创建一个HttpURLConnection对象
* 3.得到InputStram
* 4.从InputStream当中读取数据
*
@param urlStr
*
@return
*/
public String download(String urlStr)
{
StringBuffer sb = new StringBuffer();
String line = null;
BufferedReader buffer = null;
try
{
// 创建一个URL对象
url = new URL(urlStr);
// 创建一个Http连接
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection();
// 使用IO流读取数据
buffer = new BufferedReader(new InputStreamReader(urlConn
.getInputStream()));
while ((line = buffer.readLine()) != null)
{
sb.append(line);
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
buffer.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
return sb.toString();
}

/**
* 该函数返回整形 -1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在
*/
public int downFile(String urlStr, String path, String fileName)
{
InputStream inputStream = null;
try
{
FileUtils fileUtils = new FileUtils();

if (fileUtils.isFileExist(path + fileName))
{
return 1;
}
else
{
inputStream = getInputStreamFromUrl(urlStr);
File resultFile = fileUtils.write2SDFromInput(path, fileName,
inputStream);
if (resultFile == null)
{
return -1;
}
}
}
catch (Exception e)
{
e.printStackTrace();
return -1;
}
finally
{
try
{
inputStream.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
return 0;
}

/**
* 根据URL得到输入流
*
*
@param urlStr
*
@return
*
@throws MalformedURLException
*
@throws IOException
*/
public InputStream getInputStreamFromUrl(String urlStr)
throws MalformedURLException, IOException
{
url = new URL(urlStr);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConn.getInputStream();
return inputStream;
}
}



第三步,MyContentHandler.java

package my.xml;

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

import android.util.Log;

public class MyContentHandler extends DefaultHandler
{
String hisname, address, money, sex, status;
String tagName;

/**
* 开始解析xml
*
@throws SAXException
*/
public void startDocument() throws SAXException
{
System.out.println("````````begin````````");
}

/**
* 结束解析xml
*
@throws SAXException
*/
public void endDocument() throws SAXException
{
System.out.println("````````end````````");
}

/**
* 开始解析元素属性
*
*
@param namespaceURI 命名空间,防止命名重复
*
@param localName 不带前缀的名字
*
@param qName 带前缀的名字
*
@param attr 代表标签里所有的属性
*
@throws SAXException
*/
public void startElement(String namespaceURI, String localName,
String qName, Attributes attr) throws SAXException
{
tagName = localName;//把当前正在解析的无前缀的名字传给tagName

if (localName.equals("worker"))
{
//获取标签的全部属性
for (int i = 0; i < attr.getLength(); i++)
{
Log.e("@@@", (attr.getLocalName(i) + "=" + attr.getValue(i)));//得到第i个属性的名字和值
}
}
}

/**
* 结束元素解析
*
*
@param namespaceURI
*
@param localName
*
@param qName
*
@throws SAXException
*/
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException
{
//在workr标签解析完之后,会打印出所有得到的数据
tagName = "";
if (localName.equals("worker"))
{
this.printout();
}
}

/**
* 具体解析标签里的内容
*
*
@param ch 所有读取到的内容,都会放到char[]类型的数组里
*
@param start 读取的内容是从char[]数组的哪一位开始
*
@param length 从start开始,一共有多长的内容
*
@throws SAXException
*/
public void characters(char[] ch, int start, int length)
throws SAXException
{
if (tagName.equals("name"))
hisname = new String(ch, start, length);
else if (tagName.equals("sex"))
sex = new String(ch, start, length);
else if (tagName.equals("status"))
status = new String(ch, start, length);
else if (tagName.equals("address"))
address = new String(ch, start, length);
else if (tagName.equals("money"))
money = new String(ch, start, length);
}

private void printout()
{
System.out.print("name: ");
System.out.println(hisname);
System.out.print("sex: ");
System.out.println(sex);
System.out.print("status: ");
System.out.println(status);
System.out.print("address: ");
System.out.println(address);
System.out.print("money: ");
System.out.println(money);
System.out.println();
}

}



第四步,在完成了上面三个类的编写,XMLActivity.java就只要实现简单的调用就可以了:

package my.xml;

import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;

import my.utils.HttpDownloader;
import my.xml.R;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class XMLActitity extends Activity
{
/** Called when the activity is first created. */
private Button parseButton;

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

parseButton = (Button) findViewById(R.id.parseButton);
parseButton.setOnClickListener(new ParseButtonListener());
}

class ParseButtonListener implements OnClickListener
{
@Override
public void onClick(View v)
{
HttpDownloader hd = new HttpDownloader();//new一个HttpDownloader对象
String resultStr = hd
.download("http://192.168.1.112/test.xml");//把下载的字符串放在resultStr
try
{
/**
* 创建一个SAXParserFactory,再用这个工厂来创建一个XMLReader,以此来读取XML
* 这个方法就是这样写的,没有什么为什么,只是规定的格式罢了。
*/
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader reader = factory.newSAXParser().getXMLReader();

//为XMLReader设置内容处理器,MyContentHandler()为具体处理的类
reader.setContentHandler(new MyContentHandler());
//开始解析文件
reader.parse(new InputSource(new StringReader(resultStr)));
}
catch (Exception e)
{
e.printStackTrace();
}
}

}
}



在MyContentHandler 继承DefaultHandler中,主要是使用了适配器设计模式,不必实现接口中的所有方法。ok!

相关文章
|
1月前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
322 11
|
9天前
|
监控 安全 网络安全
深入解析PDCERF:网络安全应急响应的六阶段方法
PDCERF是网络安全应急响应的六阶段方法,涵盖准备、检测、抑制、根除、恢复和跟进。本文详细解析各阶段目标与操作步骤,并附图例,助读者理解与应用,提升组织应对安全事件的能力。
162 89
|
1月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
233 30
|
1月前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
1月前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
117 3
|
1月前
|
存储 监控 网络协议
一次读懂网络分层:应用层到物理层全解析
网络模型分为五层结构,从应用层到物理层逐层解析。应用层提供HTTP、SMTP、DNS等常见协议;传输层通过TCP和UDP确保数据可靠或高效传输;网络层利用IP和路由器实现跨网数据包路由;数据链路层通过MAC地址管理局域网设备;物理层负责比特流的物理传输。各层协同工作,使网络通信得以实现。
|
1月前
|
域名解析 弹性计算 安全
阿里云服务器租用、注册域名、备案及域名解析完整流程参考(图文教程)
对于很多初次建站的用户来说,选购云服务器和注册应及备案和域名解析步骤必须了解的,目前轻量云服务器2核2G68元一年,2核4G4M服务器298元一年,域名注册方面,阿里云推出域名1元购买活动,新用户注册com和cn域名2年首年仅需0元,xyz和top等域名首年仅需1元。对于建站的用户来说,购买完云服务器并注册好域名之后,下一步还需要操作备案和域名绑定。本文为大家展示阿里云服务器的购买流程,域名注册、绑定以及备案的完整流程,全文以图文教程形式为大家展示具体细节及注意事项,以供新手用户参考。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
115 2
|
1月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
1月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

推荐镜像

更多