元素的localname是什么
发布网友
发布时间:2023-03-04 23:38
我来回答
共1个回答
热心网友
时间:2024-12-05 21:31
zhangmiao14
博客园 首页 联系 管理
随笔 - 122 文章 - 0 评论 - 44 阅读 - 26万
Android之SAX解析XML
一.SAX解析方法介绍
SAX(Simple API for XML)是一个解析速度快并且占用内存少的XML解析器,非常适合用于Android等移动设备。
SAX解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方式,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。并且,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。
在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通过parser()方法来解析XML文档,并产生事件。事件处理器是org.xml.sax包中ContentHandle、DTDHandler、ErrorHandler以及EntityResolver这4个接口。XMLReader通过相应事件处理器注册方法setXXX()来完成的与ContentHandle、DTDHandler、ErrorHandler以及EntityResolver这4个接口的连接。
什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。
优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android,极力推荐使用SAX解析。
缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。
使用场合:机器有性能*。
二、SAX解析步骤
1.创建SAXParserFactory对象
SAXParserFactory spf = SAXParserFactory.newInstance();
2.根据SAXParserFactory.newSAXParser()方法返回一个SAXParser解析器
SAXParser saxParser = spf.newSAXParser();
3.实例为一个DefaultHandler对象
复制代码
public class XMLContentHandler extends DefaultHandler {
//接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理。
@Override
public void startDocument() throws SAXException {
...
}
//接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中uri表示元素的命名空间;
//localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);attrs表示元素的属性集合。
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
...
}
//接收字符数据的通知。改方法用来处理在XML文件中读到的内容,第一个参数用来存放文件的内容,后面两个参数
//是读到的字符串在这个数组中的起始位置和长度。使用newSreing(ch,start,length)就可以获取内容。
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
...
}
//接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;
//localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)。
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
...
}
复制代码
4.调用SAXParser的parser方法从输入源中获取到XML数据
saxParser.parse(inputStream, handler);
inputStream.close();
也可以使用XMLReader的parse方法从输入源中获取到XML数据。
5.通过DefaultHandler返回我们需要的数据集合。
handler.getPersons();
三、SAX解析XML代码
1.创建一个XML文件itcase.xml,并将其放在res/raw文件夹下。
复制代码
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>lixiangmei</name>
<age>25</age>
</person>
</persons>
复制代码
如果没有raw文件夹,就在res文件夹下创建一个raw文件夹,并创建xml文件。
2.修改视图
复制代码
<Button
android:id="@+id/sax_button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/fab_margin"
android:gravity="center_horizontal"
android:text="@string/SAX" />
<Button
android:id="@+id/sax_button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/fab_margin"
android:gravity="center_horizontal"
android:text="@string/SAX" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
复制代码
3.添加XMLContentHandler类
复制代码
package com.zhangmiao.analyzexmldemo;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zhangmiao on 2016/12/13.
*/
public class XMLContentHandler extends DefaultHandler {
private List<Person> persons = null;
private Person currentPerson;
private String tagName = null;
public List<Person> getPersons() {
return persons;
}
@Override
public void startDocument() throws SAXException {
persons = new ArrayList<>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (localName.equals("person")) {
currentPerson = new Person();
currentPerson.setId(Integer.parseInt(attributes.getValue("id")));
}
this.tagName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (tagName != null) {
String data = new String(ch, start, length);
if (tagName.equals("name")) {
this.currentPerson.setName(data);
} else if (tagName.equals("age")) {
this.currentPerson.setAge(Short.parseShort(data));
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (localName.equals("person")) {
persons.add(currentPerson);
currentPerson = null;
}
this.tagName = null;
}
}
复制代码
4.添加AnalyzeSAM类
复制代码
package com.zhangmiao.analyzexmldemo;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* Created by zhangmiao on 2016/12/14.
*/
public class AnalyzeSAX {
public static List<Person> readXML(InputStream inputStream) {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
XMLContentHandler handler = new XMLContentHandler();
saxParser.parse(inputStream, handler);
inputStream.close();
return handler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static List<Person> readXML(InputSource inputSource) {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
XMLReader reader = saxParser.getXMLReader();
XMLContentHandler handler = new XMLContentHandler();
reader.setContentHandler(handler);
reader.parse(inputSource);
inputSource.getByteStream().close();
return handler.getPersons();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
复制代码
5.修改MainActivity类
复制代码
package com.zhangmiao.analyzexmldemo;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import org.xml.sax.InputSource;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "AnalyzeXMLDemo";
private TextView mTextView;
private InputStream inputStream;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
Button saxButton1 = (Button) findViewById(R.id.sax_button1);
Button saxButton2 = (Button) findViewById(R.id.sax_button2);
mTextView = (TextView) findViewById(R.id.text);
saxButton1.setOnClickListener(this);
saxButton2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String result = "";
inputStream = getResources().openRawResource(R.raw.itcase);
switch (v.getId()) {
case R.id.sax_button1:
result += "--------- SAX1 ---------" + "\n";
if (inputStream == null) {
result = "inputStream is null";
} else {
List<Person> personList = AnalyzeSAX.readXML(inputStream);
if (personList != null) {
for (int i = 0; i < personList.size(); i++) {
String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
+ " , age = " + personList.get(i).getAge() + ".\n";
result += message;
}
}
}
mTextView.setText(result);
break;
case R.id.sax_button2:
result += "--------- SAX2 ---------" + "\n";
InputSource inputSource = new InputSource();
inputSource.setByteStream(inputStream);
if (inputSource == null) {
result = "inputStream is null";
} else {
List<Person> personList = AnalyzeSAX.readXML(inputSource);
if (personList != null) {
for (int i = 0; i < personList.size(); i++) {
String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
+ " , age = " + personList.get(i).getAge() + ".\n";
result += message;
}
}
}
mTextView.setText(result);
break;
default:
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
复制代码
参考文章:
http://www.open-open.com/lib/view/open1392780226397.html
http://www.cnblogs.com/weixing/archive/2013/08/07/3243366.html
http://www.tuicool.com/articles/IvQvyq
标签: Android
好文要顶 关注我 收藏该文
zhangmiao14
粉丝 - 27 关注 - 6
+加关注
0 0
« 上一篇: Android之Deg--Circular dependencies cannot exist in AnimatorSet
» 下一篇: Android之DOM解析XML
posted on 2016-12-15 15:40 zhangmiao14 阅读(1601) 评论(0) 编辑 收藏 举报
刷新评论刷新页面返回顶部
登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页
编辑推荐:
· dotnet 代码优化 聊聊逻辑圈复杂度
· 一个棘手的生产问题,但是我写出来之后,就是你的了
· 你可能不知道的容器镜像安全实践
· .Net 6 使用 Consul 实现服务注册与发现
· SQLSERVER 的复合索引和包含索引到底有啥区别?
阅读排行:
· Rex与前端表格施展“组合拳”,实现大屏展示应用的交互增强
· dotnet 代码优化 聊聊逻辑圈复杂度
· 博客园主题修改分享 - 过年篇
· gRPC入门与实操(.NET篇)
· 如何优雅地校验后端接口数据,不做前端背锅侠
昵称: zhangmiao14
园龄: 8年8个月
粉丝: 27
关注: 6
+加关注
<2023年1月>
日一二三四五六
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
最新随笔
1.2020 年总结,2021 年计划
2.2019年总结,2020年计划
3.[网络]HTTP
4.Java多线程编程核心技术-第7章-拾遗增补-读书笔记
5.Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记
6.Java多线程编程核心技术-第5章-定时器 Timer-读书笔记
7.Java多线程编程核心技术-第4章-Lock的使用-读书笔记
8.Java多线程编程核心技术-第3章-线程间通信-读书笔记
9.Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记
10.Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
我的标签
Android(45)
书籍阅读笔记(35)
Android之debug(10)
其他技术(10)
Java(5)
总结(4)
Android组件(3)
Android之View(3)
Android开发技术周报学习记录(3)
翻译(2)
更多
积分与排名
积分 - 144331
排名 - 8300
随笔档案 (122)
2021年1月(1)
2020年1月(1)
2019年11月(1)
2019年9月(5)
2019年8月(2)
2019年4月(7)
2019年3月(3)
2019年2月(7)
2019年1月(6)
2018年12月(4)
2018年11月(3)
2018年10月(5)
2018年9月(5)
2018年8月(2)
2018年7月(4)
更多
阅读排行榜
1. Unity之Animation动画(51984)
2. Android百度地图开发-第一篇:申请、搭建百度地图(15357)
3. Lottie的使用(11916)
4. 通知栏Notification的整理(10777)
5. Android之.9图的知识(10428)
评论排行榜
1. 2016总结,2017计划(15)
2. 2018 总结,2019 计划(14)
3. Android之Pull解析XML(3)
4. 从一个字符串中剔除连续的字符,只留一个。(2)
5. Android之SQLite数据存储(2)
推荐排行榜
1. 2018 总结,2019 计划(7)
2. 面试之Java知识整理(3)
3. 通知栏Notification的整理(2)
4. 2020 年总结,2021 年计划(1)
5. Android6.0以上关于RecyclerView显是不全的问题(1)
最新评论
1. Re:2020 年总结,2021 年计划
小姐姐,该写2021总结了哦~期待 ❤
--Will_Yang20211213
2. Re:TextView文字描边实现
控件在动态设置文字的时候会有bug,边框还是原来的。建议加上 @Override public void setText(CharSequence text, BufferType type) { s...
--一滩花生酱
3. Re:Android之Pull解析XML
挺好啊 看得懂的 补充下知识点
--冬瓜小生
4. Re:Unity之Animation动画
test answer..
--minosletitgo
5. Re:2018 总结,2019 计划
@ SkySeraph谢谢,共勉。...
--zhangmiao14
Powered by: 博客园 Copyright © 2023 zhangmiao14
Powered by .NET 7.0 on Kubernetes