首页 新闻 赞助 找找看

关于android 手机端与服务器端通信问题,读取网络xml,并保存到SQLite

0
悬赏园豆:100 [已解决问题] 解决于 2012-10-22 17:46

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块未捕获到异常,是不是代表正确读取到了输入流?
 
 
chouzhutou的主页 chouzhutou | 初学一级 | 园豆:11
提问于:2012-10-19 13:45
< >
分享
最佳答案
1

直接用json好处理的多

收获园豆:60
az235 | 大侠五级 |园豆:8483 | 2012-10-19 13:57

现在服务器端是被人开发的,我这边需要配合着写。所以只能是xml,求帮助啊!!

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 15:28

@chouzhutou: 你将获取的到的数据打印出来看看,看是否符合xml文件格式

az235 | 园豆:8483 (大侠五级) | 2012-10-19 15:34

@az235: 没解析出来任何数据

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 15:42

@chouzhutou: 那就要到前面去查原因了

az235 | 园豆:8483 (大侠五级) | 2012-10-19 15:53

@az235: 前面是指哪啊?

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 15:56

@chouzhutou:in = conn.getInputStream();获得in的这里,将这里转换为string类型,然后输出到控制台看看

az235 | 园豆:8483 (大侠五级) | 2012-10-19 16:20

@az235:10-19 16:31:08.826: I/System.out(22630): in.toString()----------->>>>>>>libcore.net.http.ChunkedInputStream@411ae578 ,代表有什么错误吗?

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 16:30

@chouzhutou: 这代表的是in数据的类型,而不是里面的数据值

az235 | 园豆:8483 (大侠五级) | 2012-10-19 16:36

@az235: 也就是说,就没读取到数据吗?这会有什么情况导致的呢?

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 16:42

@chouzhutou: 是你自己没将数据给取出来,读没读到,要打印出来才知道,多去看看toString()方法的实现,叫你打印出in的数据,根本就是in.toString()方法能打印出来的

az235 | 园豆:8483 (大侠五级) | 2012-10-19 16:53

@az235: 嗯,我再查一下怎样打印出来数据吧,试试能打印出来吗?终于有点思路了,谢谢你啊,这么耐心

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 16:59

@az235:在网上查找资料没找到怎样打印输入流的数据,我就采用了另一种思路,先在本地的assets文件夹里存储了一个xml文件,然后解析这个xml,整个程序就可以正常执行,这是说明url地址错误,或者是服务器端xml错误吗?

chouzhutou | 园豆:11 (初学一级) | 2012-10-19 20:17

@chouzhutou: 说明你不会用InputStream文件流,不是那些错误,既然用了InputStream就要知道怎么去把它转化为字符串

az235 | 园豆:8483 (大侠五级) | 2012-10-19 23:36

@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 | 园豆:11 (初学一级) | 2012-10-20 11:28

@chouzhutou: 中文需要编码

az235 | 园豆:8483 (大侠五级) | 2012-10-20 11:32

@az235: 如果说,只是为了打印出来的字符串显示出中文,我是不需要编码的,因为我最终目的是把数据存到XML文件中,我试过保存本地xml的数据到数据库,结果是数据表中的中文是可以正常显示的。如果你的意思是服务器发过来的xml,服务器端用response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");,求您再指点一下!

chouzhutou | 园豆:11 (初学一级) | 2012-10-20 12:01

@chouzhutou: 不太明白你的意思

az235 | 园豆:8483 (大侠五级) | 2012-10-20 12:10

@az235: 从服务器端读取解析xml,并保存数据到本地数据库,需要中文编码吗?

chouzhutou | 园豆:11 (初学一级) | 2012-10-20 14:51

@chouzhutou: 这个我没试过,你自己试下看看,顺便把结果发给我下

az235 | 园豆:8483 (大侠五级) | 2012-10-20 15:03

@az235: 好吧,谢谢你啊,只是现在没有思路了,为什么解析网络的xml数据就失败呢?

chouzhutou | 园豆:11 (初学一级) | 2012-10-20 15:34
其他回答(1)
1

看下你生成的xml文件的格式是否符合规范,再单独把获取输入流那里try catch一下。判断下是否为空。如果两样都没问题,你再具体检查下这个解析的方法是否有问题。看能不能解决,如果还是不行,晚点发个解析的方法给你参考。

收获园豆:40
charmy | 园豆:242 (菜鸟二级) | 2012-10-22 14:22

谢谢啊,我已经找到错误所在了。xml文件的格式不正确,可以看以下我从服务器端读取xml文件然后打印输出的,最开始有个空的尖括号,所以,无法解析

支持(0) 反对(0) chouzhutou | 园豆:11 (初学一级) | 2012-10-22 17:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册