利用SAX读取写了代码,调试了一下午却一直在parse里抛异常。尼玛,Java的库函数还真心不怎么好用。

把代码贴上来先:

  1. package com.example.gulanfinddemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.xml.parsers.ParserConfigurationException;
  6.  
  7. import org.xml.sax.SAXException;
  8.  
  9. import android.app.Activity;
  10. import android.content.Intent;
  11. import android.os.Bundle;
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.widget.ArrayAdapter;
  15. import android.widget.Spinner;
  16.  
  17. public class MainActivity extends Activity {
  18.  
  19. private Spinner suraIDpinner;
  20. private QuranXmlParser quranXmlParser;
  21.  
  22. final public static String ExtraStr = "FindRes";
  23.  
  24. private static final String[] m={"1","2","3","4","5"};
  25. private ArrayAdapter<String> adapter;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_main);
  31.  
  32. quranXmlParser = new QuranXmlParser();
  33.  
  34. Log.v("MainActivity", "1");
  35.  
  36. try {
  37. quranXmlParser.ReadXML("GuLan.xml");
  38. } catch (ParserConfigurationException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. } catch (SAXException e) {
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. } catch (IOException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48.  
  49. InitSuraIDSpinner();
  50.  
  51. suraIDpinner.setPrompt("请输入将要查询的章树");
  52.  
  53. //设置下拉列表的风格
  54. adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,m);
  55.  
  56. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  57.  
  58. //将adapter 添加到spinner中
  59. suraIDpinner.setAdapter(adapter);
  60.  
  61. }
  62.  
  63. public void InitSuraIDSpinner(){
  64. suraIDpinner = (Spinner)findViewById(R.id.SuraIDSpinner);
  65. }
  66.  
  67. public void onClickSuraAyaFindBtn(View view){
  68. Intent intent = new Intent(this, FindResActivity.class);
  69. String selectedString = suraIDpinner.getSelectedItem().toString();
  70. if(null==selectedString){
  71. selectedString="NoThing";
  72. }
  73. intent.putExtra(ExtraStr, selectedString);
  74. startActivity(intent);
  75. }
  76. }

  新建一个FindResActivity,显示结果:

  1. package com.example.gulanfinddemo;
  2.  
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.view.Menu;
  7. import android.widget.TextView;
  8.  
  9. public class FindResActivity extends Activity {
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_find_res);
  15.  
  16. Intent intent = getIntent();
  17. String findReString = intent.getStringExtra(MainActivity.ExtraStr);
  18.  
  19. TextView resText = (TextView)findViewById(R.id.ResText);
  20. resText.setText(findReString);
  21. }
  22.  
  23. }

  一个QuranXmlParser类:

  1. package com.example.gulanfinddemo;
  2.  
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7.  
  8. import javax.xml.parsers.ParserConfigurationException;
  9. import javax.xml.parsers.SAXParser;
  10. import javax.xml.parsers.SAXParserFactory;
  11.  
  12. import org.xml.sax.InputSource;
  13. import org.xml.sax.SAXException;
  14. import org.xml.sax.XMLReader;
  15. import org.xml.sax.helpers.DefaultHandler;
  16.  
  17. import android.util.Log;
  18.  
  19. public class QuranXmlParser{
  20. private String m_res;
  21. private volatile boolean m_isDoFind;
  22.  
  23. public QuranXmlParser(){
  24. m_isDoFind=false;
  25. }
  26.  
  27. public boolean ReadXML(String xmlString) throws ParserConfigurationException, SAXException, IOException{
  28. Log.v("ReadXML", "1");
  29.  
  30. XMLHandler handler = new XMLHandler();
  31.  
  32. SAXParserFactory factory = SAXParserFactory.newInstance();
  33. SAXParser parser = factory.newSAXParser();
  34. parser.parse(xmlString,handler);
  35.  
  36. Log.v("ReadXML", "2");
  37. return true;
  38. }
  39.  
  40. }

  新建一个XMLHandler,负责具体的读取XML:

  1. package com.example.gulanfinddemo;
  2.  
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import java.util.jar.Attributes;
  8.  
  9. import javax.xml.parsers.ParserConfigurationException;
  10. import javax.xml.parsers.SAXParser;
  11. import javax.xml.parsers.SAXParserFactory;
  12.  
  13. import org.xml.sax.InputSource;
  14. import org.xml.sax.SAXException;
  15. import org.xml.sax.XMLReader;
  16. import org.xml.sax.helpers.DefaultHandler;
  17.  
  18. import android.R.integer;
  19. import android.util.Log;
  20. import android.util.Pair;
  21.  
  22. public class XMLHandler extends DefaultHandler{
  23.  
  24. public static String tag = "XMLHandler";
  25. final int quran = 0;
  26. final int suraID = 1;
  27. final int suraName = 2;
  28. final int aya = 3;
  29. final int qurantext = 4;
  30. int currentState = 0;
  31. String suraIDString;
  32. String suraNameString;
  33. String ayaID;
  34.  
  35. private HashMap<String, String> m_AyaContentMap;
  36. private Map<String, String> m_SuarIDSet;
  37. private HashMap<String, String> m_Id2IDsHashMap;
  38.  
  39. public HashMap<String, String> getAyaContentMap(){
  40. return m_AyaContentMap;
  41. }
  42.  
  43. public Map<String, String> getSuarIDSet(){
  44. return m_SuarIDSet;
  45. }
  46.  
  47. public HashMap<String, String> getId2IDsHashMap(){
  48. return m_Id2IDsHashMap;
  49. }
  50.  
  51. public void startElement(String namespacesURI , String localName , String qName , Attributes atts) throws SAXException{
  52. if(localName.equals("sura")){
  53. if(qName.equals("suraID")){
  54. currentState = suraID;
  55. }
  56. else if(qName.equals("suraName")){
  57. currentState = suraName;
  58. }
  59. }
  60. else if(localName.equals("aya")){
  61. currentState = aya;
  62. }
  63. else if (localName.equals("qurantext")){
  64. currentState = qurantext;
  65. }
  66. else if(localName.equals("quran")){
  67. currentState = quran;
  68. }
  69. }
  70.  
  71. public void endElement(String namespacesURI , String localName , String qName) throws SAXException{
  72.  
  73. }
  74.  
  75. public void characters(char[] ch , int start , int length) throws SAXException{
  76. String theString = new String(ch, start, length);
  77. if(null != theString){
  78.  
  79. }
  80. switch(currentState){
  81. case suraID:{
  82. suraIDString = theString;
  83. }
  84. break;
  85. case suraName:{
  86. suraNameString = theString;
  87. m_SuarIDSet.put(suraIDString, suraNameString);
  88. }
  89. case aya:{
  90. ayaID = theString;
  91. }
  92. break;
  93. case qurantext:{
  94. m_Id2IDsHashMap.put(suraIDString,ayaID);
  95.  
  96. final String keyString = suraIDString+":"+ayaID;
  97. m_AyaContentMap.put(keyString, theString);
  98.  
  99. Log.v(tag,keyString+" "+theString);
  100. }
  101. break;
  102. }
  103. }
  104.  
  105. }

  然后主窗口布局:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10.  
  11. <TextView android:id="@+id/keywordLabel"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="关键字查询:"
  15. android:paddingTop="15px"
  16. />
  17.  
  18. <EditText android:id="@+id/keywordEditText"
  19. android:layout_width="fill_parent"
  20. android:layout_height="wrap_content"
  21. android:layout_toRightOf="@id/keywordLabel"
  22. android:layout_alignBaseline="@id/keywordLabel"
  23. />
  24.  
  25. <Button android:id="@+id/findKeywordButton"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_below="@id/keywordEditText"
  29. android:layout_alignRight="@id/keywordEditText"
  30. android:text="查找"
  31. />
  32.  
  33. <TextView android:id="@+id/ChapterTextView"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:text="章节查询:"
  37. android:layout_below="@id/findKeywordButton"
  38. android:paddingTop="15px" />
  39.  
  40. <TextView android:id="@+id/SuraIDText"
  41. android:text="章:"
  42. android:layout_width="wrap_content"
  43. android:layout_height="wrap_content"
  44. android:layout_below="@id/ChapterTextView"
  45. />
  46.  
  47. <Spinner
  48. android:id="@+id/SuraIDSpinner"
  49. android:layout_width="fill_parent"
  50. android:layout_height="wrap_content"
  51. android:layout_below="@id/SuraIDText"
  52. android:paddingTop="15px" />
  53.  
  54. <TextView android:id="@+id/AyaIDText"
  55. android:text="节:"
  56. android:layout_width="wrap_content"
  57. android:layout_height="wrap_content"
  58. android:layout_below="@id/SuraIDSpinner"
  59. />
  60.  
  61. <Spinner android:id="@+id/AyaIDSpinner"
  62. android:layout_width="fill_parent"
  63. android:layout_height="wrap_content"
  64. android:layout_below="@id/AyaIDText"
  65. />
  66.  
  67. <Button android:id="@+id/findChapterButton"
  68. android:layout_width="wrap_content"
  69. android:layout_height="wrap_content"
  70. android:layout_below="@id/AyaIDSpinner"
  71. android:layout_alignRight="@id/AyaIDSpinner"
  72. android:text="查找"
  73. android:onClick="onClickSuraAyaFindBtn"
  74. />
  75. </RelativeLayout>

  显示结果窗口布局:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:orientation="vertical"
  5. android:layout_height="match_parent"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context=".FindResActivity" >
  11.  
  12. <TextView
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="@string/FindResShow" />
  16.  
  17. <TextView android:id="@+id/ResText"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent" />
  20.  
  21. </LinearLayout>

 主窗口显示:

读取XML的问题的更多相关文章

  1. 读取xml数据装配到字典中之应用场景

    前段时间看到支付宝设置里面有个多语言这个功能,蛮有意思的,就想双休没事的话做个相关的demo玩玩,可是礼拜六被妹子拽出去玩了一天,来大上海有大半年了,基本没有出去玩过,妹子说我是超级宅男,也不带她出去 ...

  2. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  3. MFC如何读取XML

    <?xml version="1.0" encoding="utf-8"?> <Cases> <case> <No&g ...

  4. 使用dom4j读取xml连接数据库与之单例模式

    使用dom4j读取xml ,加入jar包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar public class XmlConfigReader { //懒汉式,延迟加载 ...

  5. java DOM4J 读取XML

    最近学习Java,在处理XML文档的时候,查阅相关资料,发现了DOM4J这个jre库,相对C#的XML处理来说,功能还算是跟得上 下面展示一篇我自己写的一个XML读取测试 import java.ut ...

  6. C#中常用的读取xml的几种方法(转)

    本文完全来源于http://blog.csdn.net/tiemufeng1122/article/details/6723764,仅作个人学习之用. XML文件是一种常用的文件格式,例如WinFor ...

  7. wcf序列化大对象时报错:读取 XML 数据时,超出最大

    错误为: 访问服务异常:格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出 错: request.InnerException 消息是“反序 ...

  8. C#中常用的几种读取XML文件的方法

    1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/

  9. 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合

    转自:http://blog.csdn.net/zhao19861029/article/details/8473245 首先实现生成对应的JAVAbean的XML文件方法 /** * DMO4J写入 ...

  10. 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。

    程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...

随机推荐

  1. Centos添加新硬盘、分区、格式化、自动挂载

    创建分区 #fdisk /dev/hdb 格式化新创建的分区 #mkfs.ext3 /dev/hdb1 使新创建的分区挂载/mnt/data01目录下 #mount /dev/hdb1 /mnt/da ...

  2. 编译jsoncpp库以及要注意的问题

    原创文章,转载请注明原作者与本文原始URL. 版本:jsoncpp-src-0.5.0.zip简介:jsoncpp是用cpp实现的json库,可以拼装,解析,生成json串.我们要把他编译成动态库.这 ...

  3. jsp_属性范围_application

    如果希望设置一个属性,可以让所有用户看得见,则可以将属性范围设置成application,这样属性即可以保存在服务器上. 下面写一个小例子来验证一下: (1)application_demo.jsp ...

  4. mysql主主复制(双主复制)配置步骤

    以前我们介绍的都是主从复制,这里给各位介绍一个双主复制了,下面都希望两个主服务器数据自动复制的话可参考一下此文章.   MySQL主主复制结构区别于主从复制结构.在主主复制结构中,两台服务器的任何一台 ...

  5. rsync 配置

    1.安装rsync和配置文件 root@localhost ~]# yum -y install rsync #安装rsync服务 #CentOS 默认以 xinetd 方式运行 rsync 服务.r ...

  6. linux下解决端口被占用问题

    查找被占用的端口: netstat -tln netstat -tln | grep 8080   查看端口属于哪个程序 lsof -i :8080   杀掉占用端口的进程: kill -9 进程ID ...

  7. 用c#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)

    本文将介绍基于Senparc.Weixin微信开发框架来实现网页授权来获取用户基本信息.先生成包含授权及回调url信息的二维码:用户用微信扫描之后,被要求授权以获取Ta的用户基本信息:用户授权后,通过 ...

  8. HTML5服务器端推送事件 解决PHP微信墙推送问题

    问题描述 以前的文章中<PHP微信墙制作,开源>已经用PHP搭建了一个微信墙获取信息的服务器,然后我就在想推送技术应该怎么解决,上一篇已经用了.NET 的signalr做了一个微信墙,PH ...

  9. 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)

    一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...

  10. Kali Linux系列教程之OpenVas安装

    Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1.  服务器层组件 2.客户层组件 安装过程 Initial setup ...