android手机端读取服务器端数据。服务器端已xml的形式发送的数据,手机端用DOM解析xml的方法,读取数据并保存到SQLite中,源代码如下:
android手机端读取服务器端数据。服务器端已xml的形式发送的数据,手机端用DOM解析xml的方法,读取数据并保存到SQLite中,源代码如下: Java code private void update() { String urlStr = HttpUtil.BASE_URL + "servlet/UpdateServlet"; URLConnection conn = null ; InputStream in = null; DocumentBuilderFactory factory = null; DocumentBuilder builder = null; Document doc = null; Uri uri1 = null; ContentResolver cr = null; NodeList nl = null; try { URL url = new URL(urlStr); conn = url.openConnection(); in = conn.getInputStream(); factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); }catch (Exception e1) { System.out.println("e1.toString()---->>>>"+e1.toString()); } try { doc = builder.parse(in); }catch (Exception e2) { System.out.println("e2.toString()----->>>>"+e2.toString()); } try { nl = doc.getElementsByTagName("menu"); cr = getContentResolver(); uri1 = Menus.CONTENT_URI; cr.delete(uri1, null, null); // 循环将数据保存到SQLite for (int i = 0; i < nl.getLength(); i++) { ContentValues values = new ContentValues(); int id = Integer.parseInt(doc.getElementsByTagName("id").item(i).getFirstChild().getNodeValue()); item(i).getFirstChild().getNodeValue()); String name = doc.getElementsByTagName("name").item(i).getFirstChild().getNodeValue(); // 添加到ContenValues对象 values.put("_id", id); values.put("name", name); cr.insert(uri1, values); } }catch (Exception e3) { System.out.println("e3.toString()---->>>"+e3.toString()); } }
捕获到异常:
10-19 08:51:29.405: I/System.out(18908): e2.toString()----->>>>org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@3:2 in java.io.InputStreamReader@411cce48) 10-19 08:51:29.405: I/System.out(18908): e3.toString()---->>>java.lang.NullPointerException 第一个问题:看异常,貌似是SAX解析XML文件出的异常,但是我用的是DOM解析啊。第二个问题:第一个try/catch块未捕获到异常,是不是代表正确读取到了输入流? |
直接用json好处理的多
现在服务器端是被人开发的,我这边需要配合着写。所以只能是xml,求帮助啊!!
@chouzhutou: 你将获取的到的数据打印出来看看,看是否符合xml文件格式
@az235: 没解析出来任何数据
@chouzhutou: 那就要到前面去查原因了
@az235: 前面是指哪啊?
@chouzhutou:in = conn.getInputStream();获得in的这里,将这里转换为string类型,然后输出到控制台看看
@az235:10-19 16:31:08.826: I/System.out(22630): in.toString()----------->>>>>>>libcore.net.http.ChunkedInputStream@411ae578 ,代表有什么错误吗?
@chouzhutou: 这代表的是in数据的类型,而不是里面的数据值
@az235: 也就是说,就没读取到数据吗?这会有什么情况导致的呢?
@chouzhutou: 是你自己没将数据给取出来,读没读到,要打印出来才知道,多去看看toString()方法的实现,叫你打印出in的数据,根本就是in.toString()方法能打印出来的
@az235: 嗯,我再查一下怎样打印出来数据吧,试试能打印出来吗?终于有点思路了,谢谢你啊,这么耐心
@az235:在网上查找资料没找到怎样打印输入流的数据,我就采用了另一种思路,先在本地的assets文件夹里存储了一个xml文件,然后解析这个xml,整个程序就可以正常执行,这是说明url地址错误,或者是服务器端xml错误吗?
@chouzhutou: 说明你不会用InputStream文件流,不是那些错误,既然用了InputStream就要知道怎么去把它转化为字符串
@az235:做android我还是菜鸟级别的,而且java基础也不好,所以…………
从网络读取的数据流转化为字符串我用的方法是
int b; StringBuffer sb = new StringBuffer(); while((b = in.read())!=-1 ){ sb.append((char)b); } System.out.println(sb);
打印出来:
10-20 10:47:26.079: I/System.out(32577): <?xml version="1.0" encoding="utf-8"?> 10-20 10:47:26.079: I/System.out(995): <menulist> 10-20 10:47:26.079: I/System.out(995): <> 10-20 10:47:26.079: I/System.out(995): <menu> 10-20 10:47:26.089: I/System.out(995): <id>1</id> 10-20 10:47:26.089: I/System.out(995): <name>宫ä¿é¸¡ä¸</name> 10-20 10:47:26.089: I/System.out(995): </menu> 10-20 10:47:26.089: I/System.out(995): <menu> 10-20 10:47:26.089: I/System.out(995): <id>2</id> 10-20 10:47:26.089: I/System.out(995): <name>é¦è¾£åè±ä¸</name> 10-20 10:47:26.089: I/System.out(995): </menu> 10-20 10:47:26.089: I/System.out(995): <menu> 10-20 10:47:26.089: I/System.out(995): <id>3</id> 10-20 10:47:26.089: I/System.out(995): <name>çè¾ä»</name> 10-20 10:47:26.089: I/System.out(995): </menu> 10-20 10:47:26.089: I/System.out(995): <menu> 10-20 10:47:26.089: I/System.out(995): <id>4</id> 10-20 10:47:26.089: I/System.out(995): <name>åæ¤éé¾é±¼</name> 10-20 10:47:26.099: I/System.out(995): </menu> 10-20 10:47:26.099: I/System.out(995): <menu> 10-20 10:47:26.099: I/System.out(995): <id>5</id> 10-20 10:47:26.099: I/System.out(995): <name>红ç§è</name> 10-20 10:47:26.099: I/System.out(995): </menu> 10-20 10:47:26.099: I/System.out(995): <menu> 10-20 10:47:26.099: I/System.out(995): <id>6</id> 10-20 10:47:26.099: I/System.out(995): <name>æé³ä¸åè</name> 10-20 10:47:26.099: I/System.out(995): </menu> 10-20 10:47:26.099: I/System.out(995): </menulist>
这应该可以说明从网络读取到了xml,但是可能xml文件不正确,所以无法用DOM的方法解析出来?
我在本地的assets写了一个xml文件,
<?xml version="1.0" encoding="utf-8"?> <menulist> <menu> <id>1</id> <name>张三</name> </menu> <menu> <id>2</id> <name>李四</name> </menu> <menu> <id>3</id> <name>王五</name> </menu> <menu> <id>4</id> <name>高小小</name> </menu> <menu> <id>5</id> <name>李大大</name> </menu> <menu> <id>6</id> <name>郭剩剩</name> </menu> </menulist>
用同样的解析方法,可以解析并且把数据保存到SQLite的数据表中。
@chouzhutou: 中文需要编码
@az235: 如果说,只是为了打印出来的字符串显示出中文,我是不需要编码的,因为我最终目的是把数据存到XML文件中,我试过保存本地xml的数据到数据库,结果是数据表中的中文是可以正常显示的。如果你的意思是服务器发过来的xml,服务器端用response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");,求您再指点一下!
@chouzhutou: 不太明白你的意思
@az235: 从服务器端读取解析xml,并保存数据到本地数据库,需要中文编码吗?
@chouzhutou: 这个我没试过,你自己试下看看,顺便把结果发给我下
@az235: 好吧,谢谢你啊,只是现在没有思路了,为什么解析网络的xml数据就失败呢?
看下你生成的xml文件的格式是否符合规范,再单独把获取输入流那里try catch一下。判断下是否为空。如果两样都没问题,你再具体检查下这个解析的方法是否有问题。看能不能解决,如果还是不行,晚点发个解析的方法给你参考。
谢谢啊,我已经找到错误所在了。xml文件的格式不正确,可以看以下我从服务器端读取xml文件然后打印输出的,最开始有个空的尖括号,所以,无法解析