android手机端读取服务器端数据。服务器端已xml的形式发送的数据,手机端用DOM解析xml的方法,读取数据并保存到SQLite中,源代码如下:
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块未捕获到异常,是不是代表正确读取到了输入流?

解决方案 »

  1.   

    xml解析出错,调试try {
    } catch (SAXParseException e) {
        e.printStackTrace();
    }第二个问题是空指针了
    你双击看跳到哪一行
    另外for (int i = 0; i < nl.getLength()-1; i++) 会不会是越界了呢
      

  2.   

    这两个异常是我用System.out.println的方法打印出来的,所以没法双击看跳到哪一行,因为我执行程序后,看到本地数据库还是没有任何数据,而程序执行中没有报任何错误。所以我在调试中打印了一下,看到走的是catch块。第一个问题,我按您的方法该了,但还是打印出一样的结果,再次请教
      

  3.   

    不成功,解析错误,守先我会怀疑过来的数据是不是真正意义xml输出看一下
    调用解析方法是否正确,而不是直接看结果
    你看下这个例子吧,和你的差不多
    http://blog.csdn.net/wong_judy/article/details/5854888
      

  4.   


    我在本地的文件夹assets里写了一个xml,然后解析这个xml就可以征程运行。怎样输出过来的xml呢?
      

  5.   

    建议:你可以将远程的文件读写到本地,然后在本地解析,由此来判定后台返回的是不是正确的xml格式。
      

  6.   

    应该是服务器传过来的数据不符合你的解析规范吧。
    直接从获得的InputStream里读取数据然后打印出来,看看是否正确。
      

  7.   

    怎样从获得的InputStream里读取数据然后打印啊?给几个关键代码吧!我昨天百度了半天没找到,新手,谢谢您的帮助!!!
      

  8.   


    远程文件怎样保存到本地啊?或者怎样从输入流读取打印出来数据,以验证读过来的是不是xml文件,求帮助,谢谢您啦!!
      

  9.   


    从网络读取的数据流,我用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文件,但是可能格式不对,所以没法解析?
      

  10.   


    打印出来的乱码是中文。既然格式是对的,我的DOM解析方法也是对的,为什么解析不了呢?