热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android开发基础教程—三种方式实现xml文件解析

本文将介绍三种方式:sax方式dom方式pull方式实现xml文件解析,感兴趣的朋友可以了解下
1.sax方式
代码如下:

/**
* 使用sax解析
*/
public class SaxParse{
/**
* sax解析器
*/
private SAXParser parser;
public SaxParse(){
try {
SAXParserFactory f = SAXParserFactory.newInstance();
parser = f.newSAXParser();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public List doParse(InputStream is) {
try {
XmlHandler h = new XmlHandler();
parser.parse(is,h);
return h.getpersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 处理器
*/
class XmlHandler extends DefaultHandler{
List persOns= null ;
Person person = null ;
//当前元素名称
private String currEleName;
/**
* 文本节点触发该方法
*/
public void characters(char[] ch, int start, int length)throws SAXException {
String str = new String(ch,start,length);
//name
if("name".equals(currEleName)){
person.name = str ;
}
else if("age".equals(currEleName)){
person.age = Integer.parseInt(str);
}
}
public void endDocument() throws SAXException {
}
/**
* 元素结束
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("person".equals(localName)){
persons.add(person);
}
//将当前元素置空
else if(("name".equals(currEleName)) || ("age".equals(currEleName))){
this.currEleName = "" ;
}
}
/**
* 文档开始事件
*/
public void startDocument() throws SAXException {
persOns= new ArrayList();
}
/**
* 元素开始事件
* localName:本地名
* uri:名字空间
* qName:限定名,前缀 + 本地名
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//实例化person对象
if("person".equals(localName)){
person = new Person();
person.id = Integer.parseInt(attributes.getValue(0));
}
//name元素
else if("name".equals(localName)){
this.currEleName = "name" ;
}
//name元素
else if("age".equals(localName)){
this.currEleName = "age" ;
}
}
public List getpersons(){
return persons ;
}
}
}

2.dom方式
代码如下:

/**
* DOM解析
*/
public class DomParse{
//
private DocumentBuilder builder;
public DomParse(){
try {
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
this.builder = f.newDocumentBuilder();
} catch (Exception e) {
e.printStackTrace();
}
}
public List doParse(InputStream is) {
List persOns= new ArrayList();
Person person = null ;
try {
Document doc = builder.parse(is);
NodeList list = doc.getElementsByTagName("person");
Element ele = null ;
for(int i = 0 ; i ele = (Element) list.item(i);
person = new Person();
person.id = Integer.parseInt(ele.getAttribute("id"));
person.name = getSubElementTextContent(ele,"name");
person.age = Integer.parseInt(getSubElementTextContent(ele,"age"));
persons.add(person);
}
} catch (Exception e) {
e.printStackTrace();
}
return persons;
}
/**
* 得到指定的资源中中间的文本内容
*/
private String getSubElementTextContent(Element ele, String tagName) {
NodeList list = ele.getElementsByTagName(tagName);
Element e = (Element) list.item(0);
//得到中间的文本节点
return e.getTextContent();
}
}

3.pull方式
代码如下:

/**
* pull解析,拉模式,可以手动控制下一个事件是否触发.
*/
public class PullParse{
public List doParse(InputStream is) {
List persOns= null ;
Person person = null ;
try {
XmlPullParser parser = Xml.newPullParser();
//设置解析数据源
parser.setInput(is, "utf-8");
//取得事件的类型
int eventType = parser.getEventType();
String eleName = null ;
while(eventType != XmlPullParser.END_DOCUMENT){
switch(eventType){
//文档开始
case XmlPullParser.START_DOCUMENT:
persOns= new ArrayList();
break ;
//元素开始
case XmlPullParser.START_TAG:
eleName = parser.getName();
if("person".equals(eleName)){
person = new Person();
person.id = Integer.parseInt(parser.getAttributeValue(0));
}
else if("name".equals(eleName)){
person.name = parser.nextText();
}
else if("age".equals(eleName)){
person.age = Integer.parseInt(parser.nextText());
}
break ;
//标记结束
case XmlPullParser.END_TAG:
eleName = parser.getName();
if("person".equals(eleName)){
persons.add(person);
}
break ;
}
//手动激活下个事件的触发
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return persons;
}
}

推荐阅读
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • Parallels Desktop 10 是一款功能强大的虚拟化软件,专为 Mac 用户设计,使其能够无缝运行 Windows 应用程序。该软件不仅显著提升了图形应用的性能,还优化了演示效果。对于需要在 Mac 上高效运行 Windows 程序的用户来说,Parallels Desktop 10 是一个理想的选择。本文将介绍如何获取其激活码及免费下载渠道,帮助用户轻松激活并使用这一强大工具。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 本文深入探讨了Hibernate框架中乐观锁和悲观锁的机制及其多态特性。乐观锁假设数据在大多数情况下不会发生冲突,因此在读取数据时不加锁,而是在更新时检查版本号以确保数据未被修改。相比之下,悲观锁则认为数据在并发环境下容易产生冲突,因此在读取数据时立即加锁,以防止其他事务访问同一数据,从而避免潜在的数据不一致问题。文章还详细分析了这两种锁机制在实际应用中的优缺点,并介绍了Hibernate中的多态特性如何与锁机制结合,以实现更高效的数据管理和并发控制。 ... [详细]
  • 深入解析 SAP UI5 Page 控件的构造函数参数及其应用
    深入解析 SAP UI5 Page 控件的构造函数参数及其应用 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 如何使用 `org.apache.poi.openxml4j.opc.PackagePart` 类中的 `loadRelationships()` 方法及其代码示例详解 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • DevExpress v17.2新版本亮点深入解析:CodeRush功能详解(下篇)
    DevExpress v17.2 最新版本现已正式发布,我们将在系列文章中详细介绍其各项新特性。本文聚焦于 CodeRush v17.2 的最新功能,包括对 XAML 标准的全面支持。欢迎下载并体验这一强大工具的全新功能。 ... [详细]
author-avatar
赛亚兔备_393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有