开发的第31天-解析有道单词本xml文件并上传到数据库
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文件并上传到数据库相关推荐
- 使用springMVC提供的CommonsMultipartResolver文件解析器,实现文件轻松上传
springMVC提供的前端控制器,可以拦截所有请求,指挥调度所有后台逻辑资源. 使用传统方式进行文件上传,需要我们手动解析request对象,获取文件上传项,再进行文件的上传. springMVC框 ...
- Android开发——应用宝推广渠道出现MD5值重复,请勿重复上传
起因 开发的小伙伴们,肯定遇到过运营的同学需要我们提供不同的推广渠道apk包.但是由于一些人为操作失误,会出现根据apk文件MD5值判断,该文件已经上传过了,请勿重复上传. 问题的出现 这是运营的同学 ...
- java 解析xml xmlns_dom4j解析带有xmlns的xml文件
dom4j解析带有xmlns的xml文件 上一篇 / 下一篇 2013-01-22 10:03:23 / 个人分类:Java学习 使用dom4j来解析带有命名空间的xml文件, 由于dom4j的xp ...
- iOS开发网络篇—文件的上传
说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: Y ...
- Java自定义生成与解析(Dom4J)XML文件
XML(Extensible Markup Language):可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 应用:XML 应用于 web 开发的许多方面, ...
- spring大文件分块上传原理解析2
这两天关于大文件上传这个问题搞得很是头疼,昨天下班回去调研了下,对于不同大小的文件对应有几种解决办法: l 500M以下的用http协议传输(网上一搜大把的),比如Flash,Plupload,W ...
- 用HttpListener做web服务器,简单解析post方式过来的参数、上传的文件
服务端: public class AdvertisementSource : IDisposable { HttpListener httpListener; ...
- Android开发笔记(一百六十六)H5通过WebView录像上传
前面的博文< Android开发笔记(一百五十二)H5通过WebView上传图片>介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页.既然如此,那么再探讨一下如何实现这个摄像上传 ...
- 使用python解析Wordpress导出的xml文件
在用wordpress导出日志时,得到的往往是xml文件,具体形式如下: <?xml version="1.0" encoding="UTF-8"?> ...
- 解析一个xml文件并将数据存入数据库
解析xml文件并将文件存入数据库 一.使用dom4j对xml文件进行解析 1.首先要有一个xml文件 2.需求 3.创建Books实例类 4.开始解析xml文件 5.测试代码: 6.结果: 二.进行数 ...
最新文章
- 不一样的Gradle多渠道配置总结
- python语言开发的软件有哪些-最适合人工智能开发的5种编程语言,你知道几种?...
- 思科同时匹配源和目标地址进行策略路由配置测试
- ElasticSearch基本插件head
- qDebug格式化输出类型
- 【LeetCode - 798】得分最高的最小轮调(转化法)
- Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
- java ssh2连接_通过JCraft的jsch包基于SSH2协议实现连接linux服务器提供终端操作的java工具实现类SftpUtil...
- 使用windows2003架设邮件服务器
- Hibernate中创建Session(会话)接口的方法
- SQL server时间栏位默认值
- matlab zn整定,matlab里用ZN整定公式对系统进行PI、PID校正,程序问题,急!!
- 卤煮花生米的制作过程(高压锅版)
- 如何4步绘制出高水平的气泡图?
- SpringCloud_Dubbo_JZZ_MBY
- RK WiFi驱动层初始化分析
- 七种常见软件开发模型
- 2021年安全员-B证(山东省-2020版)考试试卷及安全员-B证(山东省-2020版)复审考试
- AirFlow调度执行Talend ETL任务
- 为什么很多人都认为编程很难学?