问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

元素的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
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求狗狗不能吃的东东? 魔兽世界60级猎人带什么宝宝的问题 沈阳苹果手机售后维修点有哪些 沈阳哪里修理手机比较好一点 妈咪,胸口第三根肋骨骨折吃什么可以补。 胸口肋骨断掉最适宜的方法? ...不小心胸口摔着了,上周去医院查出左侧4 5肋骨骨折,当时医生只配了两... 有百度文库VIP账号的大神们可以帮我下载这个文档吗 百度文库免费下载ppt方法介绍-百度文库怎么免费下载ppt 初中英语翻译 在线等! 秋天吃南瓜要注意什么?红枣和南瓜怎么做好吃? 秋天吃南瓜要注意什么 农行卡跟农村信用社卡号可能一样吗 解毒药物有哪些? 小学数学3大方法培养起学生的抽象思维能力 抽象思维是什么?怎样培养抽象思维? 抽象思维法的含义与作用方法 蓝莓种植前景 马自达3已开5万公里可以卖多少钱 马自达32013款多少钱 马自达3 1.6L自动 首付多少,3年期的大概每月还多少!利息多少 马自达3买了3年了开了19000能卖多少钱? 土壤检测多少钱,土壤检测具体费用 肾虚能吃海参吗?吃海参对肾好吗? 肾阴虚吃海参怎么样 阴虚火旺能吃海参吗 阴虚盗汗是什么原因引起的 阴虚的人可以吃海参吗 sqlserver 怎样取出最后几条数据 有个马的车是什么牌子的车 有只马的车是什么牌子 购新房注意事项有哪些 第一次买新房注意事项 DELPHI基础教程:Delphi开发数据库应用程序概述(一)[4] ...json对象转换成mongodb对象,然后存到mongodb数据库中 魏鹏远个人简历介绍 魏鹏远家中现金有多少 魏鹏远的介绍 人民币汇率将在双向波动中保持稳定吗? 客观分析,人民币为什么如此坚挺 冬季吃红枣有什么好处 可转债募集资金可以用作银行承兑汇票保证金吗 腾龙股价发行可转债是否通过 oracleto_str函数用法 oracle判断字符串全是0 彩铅画迎国庆的手抄报 迎国庆的手抄报 鼻翼有痣的女人代表什么意思啊 男人痣相图解分析 鼻翼有痣好不好 Oracle 9i体系结构里面的ckpt的触发机制是什么 我下了一个网站程序 没密码怎么进 急急 在线等待 新股中签技巧 Python: 写ORM插入MySql数据库报错:Incorrect string value: &#39;