2019-3-12

标题安卓背词客开发日记

今天要实现的功能是用户可以自己从手机sd卡中读取xml文件 ,并解析到单词数据库。
解决的问题有以下两点

  • 如何读取到用户的本地文件
  • 如何解析xml文件

解决办法

首先使用系统自带的文件浏览器找到文件的目录,我们只需得到路径就行了。
参考这篇帖子 。https://blog.csdn.net/dezhihuang/article/details/53282820 下面引用下代码

`看看下面这两个函数

private void chooseFile() {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.setType("*/*");intent.addCategory(Intent.CATEGORY_OPENABLE);try {startActivityForResult(Intent.createChooser(intent, "选择文件"), FILE_SELECT_CODE);} catch (android.content.ActivityNotFoundException ex) {Toast.makeText(this, "亲,木有文件管理器啊-_-!!", Toast.LENGTH_SHORT).show();}}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubSystem.err.println("我来到文件管理器了"+requestCode+"              "+resultCode);if (resultCode != Activity.RESULT_OK) {Log.e(TAG, "onActivityResult() error, resultCode: " + resultCode);super.onActivityResult(requestCode, resultCode, data);return;}if (requestCode == FILE_SELECT_CODE) {System.err.println(" 查看"+requestCode+"              "+resultCode);uri = data.getData();uristr = uri.getPath();Log.i(TAG, "------->" + uris);et1.setText(urlstr);Toast.makeText(Createbook.this, "路徑是"+urlstr, 0).show();  }super.onActivityResult(requestCode, resultCode, data);}

解释下这三个参数,研究了一下才明白
requestcode ,是请求码,用来知道是哪一个activity返回来的数据
resultcode, 是结果码,用来知道返回状态 -1表示成功
data 就是我们需要的数据 通过data.getpath()得到路径并复制到editview上显示。

下面开始将文件变成输入流。

              String temp =et1.getText().toString().trim();InputStream instream;File file = new File(temp);try {instream = new FileInputStream(file);//解析输入流List<WordBean> words = Wordparser.parserXml(instream);//下面会说这个beanSystem.out.println(words.size());book_number=words.size();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}

这样就完成 本地文件的 拿到解析 ,主要的思路是
拿到文件路径----变输入流-------------解析

xml文件的解析

以有道单词本为例子 使用XmlPullParser 先看看xml的节点

<wordbook>
<item>    <word>metallic</word><trans><![CDATA[adj. 金属的,含金属的]]></trans><phonetic><![CDATA[[mi'tælik, me-]]]></phonetic><tags>CET-6</tags><progress>-1</progress>
</item>
<item>    <word>quantitative</word><trans><![CDATA[adj. 定量的;量的,数量的]]></trans><phonetic><![CDATA[['kwɔntitətiv, -tei-]]]></phonetic><tags>CET-6</tags><progress>-1</progress>
</item>
<item>   <word>clarity</word><trans><![CDATA[n. 清楚,明晰;透明]]></trans><phonetic><![CDATA[['klærəti]]]></phonetic><tags>CET-6</tags><progress>-1</progress>
</item>>
</wordbook>

首先建立javabean类来保存单词信息 Wordbean.java


public class Wordbean {private String word;
private String translate;
private String phonetic;
private String tags;//写set getpublic String getWord() {return word;
}
public void setWord(String word) {this.word = word;
}
public String getTranslate() {return translate;
}
public void setTranslate(String translate) {this.translate = translate;
}
public String getTags() {return tags;
}
public void setTags(String tags) {this.tags = tags;
}
public String getPhonetic() {return phonetic;
}
public void setPhonetic(String phonetic) {this.phonetic = phonetic;
}}

下面给定义解析类


public class Wordparser {public static List<Wordbean> parserXml(InputStream in) throws Exception{//[0]声明集合对象 List<Wordbean> words = null;Wordbean  Wordbean = null;//[1]获取XmlPullParser 解析的实例 XmlPullParser parser = Xml.newPullParser();//[2]设置XmlPullParser 的参数 parser.setInput(in, "utf-8");    //[3]获取事件类型int type = parser.getEventType();while(type!= XmlPullParser.END_DOCUMENT){     switch (type) {case XmlPullParser.START_TAG:   //解析开始标签//[4]具体判断一下 解析到是哪个开始标志if ("wordbook".equals(parser.getName())) {//[5]创建一个集合对象words = new ArrayList<Wordbean>();}else if("item".equals(parser.getName())){//[6]创建Wordbean对象Wordbean = new Wordbean();}else if("word".equals(parser.getName())){//[8]获取word的数据 String word = parser.nextText();Wordbean.setWord(word);}else if("trans".equals(parser.getName())){//[8]获取trans的数据 String trans = parser.nextText();Wordbean.setTranslate(trans);                  }else if("phonetic".equals(parser.getName())){//[8]获取phonetic的数据 String phonetic = parser.nextText();Wordbean.setPhonetic(phonetic);}else if("tags".equals(parser.getName())){//[8]获取tags的数据 String tags = parser.nextText();Wordbean.setTags(tags);}break;case XmlPullParser.END_TAG:     //解析结束标志 //判断要解析的结束标签 if ("item".equals(parser.getName())) {//把javabean对象存到集合中 words.add(Wordbean);//                System.out.println("解析完成一次");}break;}//不停的向下解析type = parser.next();}return words;}}

解决的思路是
先根据xml的格式建立javabean对象 --------------然后创建解析类。
找到开始关键节点 wordbook 表示开始和结束item 便是一个单词结束
因此当找到item结束标签的时候就说明wordbean已经赋值结束,要把它加入集合中。

下面说说XmlPullParser 的几个参数
XmlPullParser.START_TAG: //解析开始标签
XmlPullParser.END_TAG: //解析结束标志
nextText() //得到标签下的值
注意不可以在一个节点用两次比如

else if("trans".equals(parser.getName())){//[8]获取trans的数据 String trans = parser.nextText();Wordbean.setTranslate( parser.nextText());         //此时单词的值就不对了,我一开始就这样犯错了      }

将word 集合传到sqlite数据库

public void createbook_tosql(List<Wordbean> words) {myOpenHepler my = new myOpenHepler(context);db = my.getWritableDatabase();try {for (Wordbean word : words) {ContentValues cv = new ContentValues();cv.put("word", word.getWord());cv.put("phonetic", word.getPhonetic());cv.put("translate", word.getTranslate());cv.put("tags", word.getTags());//加入数据库db.insert("word", null, cv);count++;}state="导入成功!  已导入" + count + "行";System.out.println(state);} catch (Exception e) {e.printStackTrace();}}


今天就到这 ,溜了溜了

开发的第31天-解析有道单词本xml文件并上传到数据库相关推荐

  1. 使用springMVC提供的CommonsMultipartResolver文件解析器,实现文件轻松上传

    springMVC提供的前端控制器,可以拦截所有请求,指挥调度所有后台逻辑资源. 使用传统方式进行文件上传,需要我们手动解析request对象,获取文件上传项,再进行文件的上传. springMVC框 ...

  2. Android开发——应用宝推广渠道出现MD5值重复,请勿重复上传

    起因 开发的小伙伴们,肯定遇到过运营的同学需要我们提供不同的推广渠道apk包.但是由于一些人为操作失误,会出现根据apk文件MD5值判断,该文件已经上传过了,请勿重复上传. 问题的出现 这是运营的同学 ...

  3. java 解析xml xmlns_dom4j解析带有xmlns的xml文件

    dom4j解析带有xmlns的xml文件 上一篇 / 下一篇  2013-01-22 10:03:23 / 个人分类:Java学习 使用dom4j来解析带有命名空间的xml文件, 由于dom4j的xp ...

  4. iOS开发网络篇—文件的上传

    说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: Y ...

  5. Java自定义生成与解析(Dom4J)XML文件

    XML(Extensible Markup Language):可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 应用:XML 应用于 web 开发的许多方面, ...

  6. spring大文件分块上传原理解析2

    这两天关于大文件上传这个问题搞得很是头疼,昨天下班回去调研了下,对于不同大小的文件对应有几种解决办法: l   500M以下的用http协议传输(网上一搜大把的),比如Flash,Plupload,W ...

  7. 用HttpListener做web服务器,简单解析post方式过来的参数、上传的文件

    服务端: public class AdvertisementSource : IDisposable     {         HttpListener httpListener;         ...

  8. Android开发笔记(一百六十六)H5通过WebView录像上传

    前面的博文< Android开发笔记(一百五十二)H5通过WebView上传图片>介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页.既然如此,那么再探讨一下如何实现这个摄像上传 ...

  9. 使用python解析Wordpress导出的xml文件

    在用wordpress导出日志时,得到的往往是xml文件,具体形式如下: <?xml version="1.0" encoding="UTF-8"?> ...

  10. 解析一个xml文件并将数据存入数据库

    解析xml文件并将文件存入数据库 一.使用dom4j对xml文件进行解析 1.首先要有一个xml文件 2.需求 3.创建Books实例类 4.开始解析xml文件 5.测试代码: 6.结果: 二.进行数 ...

最新文章

  1. 不一样的Gradle多渠道配置总结
  2. python语言开发的软件有哪些-最适合人工智能开发的5种编程语言,你知道几种?...
  3. 思科同时匹配源和目标地址进行策略路由配置测试
  4. ElasticSearch基本插件head
  5. qDebug格式化输出类型
  6. 【LeetCode - 798】得分最高的最小轮调(转化法)
  7. Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
  8. java ssh2连接_通过JCraft的jsch包基于SSH2协议实现连接linux服务器提供终端操作的java工具实现类SftpUtil...
  9. 使用windows2003架设邮件服务器
  10. Hibernate中创建Session(会话)接口的方法
  11. SQL server时间栏位默认值
  12. matlab zn整定,matlab里用ZN整定公式对系统进行PI、PID校正,程序问题,急!!
  13. 卤煮花生米的制作过程(高压锅版)
  14. 如何4步绘制出高水平的气泡图?
  15. SpringCloud_Dubbo_JZZ_MBY
  16. RK WiFi驱动层初始化分析
  17. 七种常见软件开发模型
  18. 2021年安全员-B证(山东省-2020版)考试试卷及安全员-B证(山东省-2020版)复审考试
  19. AirFlow调度执行Talend ETL任务
  20. 为什么很多人都认为编程很难学?

热门文章

  1. python 爬取热搜网教程 (上)
  2. 服务器的mdf文件怎么打开,mdf文件用什么打开 mdf文件怎么打开
  3. redhat官网关于生成rpm包的文章
  4. FileZilla Server多实例监听
  5. java web学习步骤,javaweb学习路线有哪些?如何学习?
  6. 人脸关键点数据集整理
  7. rp软件app流程图_AxureRP介绍
  8. 路由交换的一些常见知识点总结
  9. mysql不是内部命令_mysql不是内部命令的错误解决方案
  10. 花呗问答匹配(part3 各种模型运行)