我写的一个android客户端,需要通过访问Web服务器,返回XML,android客户端读取XML数据。
访问web URL如:http://xxxx.com/Mobile/MobileAjax.aspx?pAjaxType=Login&pUserID=adminsys&pPwd=123456访问XML:<?xml version="1.0" encoding="UTF-8"?>
<LoginInfo><Islogin>true</Islogin><UserID>AdminSys</UserID><UserName>超级管理员</UserName><OrgID>100</OrgID><OrgName>繁昌县组织部</OrgName></LoginInfo>我怎么写获取XML和解析XML信息的代码。
我是一个才做安卓的新手,大家帮忙

解决方案 »

  1.   


    <?xml version="1.0" encoding="UTF-8"?>
    <LoginInfo>
        <Islogin>true</Islogin>
        <UserID>AdminSys</UserID>
        <UserName>超级管理员</UserName>
        <OrgID>100</OrgID>
        <OrgName>繁昌县组织部</OrgName>
    </LoginInfo>
      

  2.   

    http访问得到inputStream或者String然后解析啊
      

  3.   

    建议你看一下android的 xmlpull解析或者sax解析 访问http会有一个inputstream 根据该流解析即可 网上有很多教程的
      

  4.   

    我感觉sax解析虽然不错但是程序写起来麻烦一些,感觉还是dom4j好一些。
    http://download.csdn.net/detail/summersrest/4582777 
      

  5.   

    我看了那个教程,他们的流是本地文件,我这是http访问获取到,难道要先保存本地吗,那多坑爹啊。
      

  6.   


    public class GetXMLfromInternet {
    /**  
         * 得到数据  
         * @param args  
         * @return  
         */   
        public final static InputStream getStream(String path) {   
            InputStream stream = null;   
          
            URL url;
    try {
    url = new URL(path);
    //得到打开的链接对象   
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();   
            conn.setRequestMethod("GET");
            conn.setReadTimeout(3*1000); 
            conn.setConnectTimeout(6*1000);
            //设置请求超时与请求方式   
            stream = conn.getInputStream();
    } catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }catch (ProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }   
            //从链接中获取一个输入流对象   
           catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }  
                return stream;   
        }      /**
         * 解析xml
         */
    @SuppressWarnings("unchecked")
    public static void getXMLfromInternet(){

    SAXReader reader = new SAXReader();

    try {

    Document document = reader.read(getStream("http://xxxx.com/Mobile/MobileAjax.aspx?pAjaxType=Login&pUserID=adminsys&pPwd=123456"));

    Element root = document.getRootElement();

    for(Iterator<Element> it1 = root.elementIterator(); it1.hasNext();){
    Element element1 = it1.next();
    System.out.println(element1.getName()+"-------------------------------------"+element1.getText());
    for(Iterator<Element> it2 = element1.elementIterator(); it2.hasNext();){
    Element element2 = it2.next();
    System.out.println(element2.getName()+"-------------------------"+element2.getText());
    }

    }

    } catch (DocumentException e) {
    // TODO Auto-generated catch block
    System.out.println("dom4j document异常");
    e.printStackTrace();
    } }
    }
      

  7.   

    先写一个SAXHandlerpublic class LoginInfoSAXHanlder extends DefaultHandler {
    List<LoginInfo> infos;
    LoginInfo infoItem;
    int currentstate = 0; public LoginInfoSAXHanlder() {
    } public List<LoginInfo> getFeed() {
    return infos;
    } @Override
    public void startDocument() throws SAXException {
    // TODO Auto-generated method stub
    infos = new Vector<LoginInfo>(0);
    infoItem = null;
    } @Override
    public void endDocument() throws SAXException {
    // TODO Auto-generated method stub } /** XML解析器遇到XML里面的tag时就会调用这个函数。经常在这个函数内是通过localName俩进行判断而操作一些数据。 */
    @Override
    public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    if (localName.equals("LoginInfo")) {
    currentstate = 0;
    infoItem = new LoginInfo();
    return;
    }
    if (localName.equals("Islogin")) {
    currentstate = Currentstate.Islogin;
    return;
    }
    if (localName.equals("UserID")) {
    currentstate = Currentstate.UserID;
    return;
    }
    if (localName.equals("UserName")) {
    currentstate = Currentstate.UserName;
    return;
    }
    if (localName.equals("OrgID")) {
    currentstate = Currentstate.OrgID;
    return;
    }
    if (localName.equals("OrgName")) {
    currentstate = Currentstate.OrgName;
    return;
    }
    currentstate = 0;
    } /**
     * 这个方法与startElement()相对应,解析完一个tag节点后,执行这个方法。再找个例子中,如果解析一个item结束,
     * 就将item添加到list中
     */
    @Override
    public void endElement(String uri, String localName, String qName)
    throws SAXException {
    // TODO Auto-generated method stub
    if (localName.equals("ds")) {
    infos.add(infoItem);
    return;
    }
    } /**
     * 解析完节点的内容后就会执行这个方法,并且参数ch[]就是节点的内容。这个例子里我们根据currentstate的不同,来判断当前那个tag的内容,
     * 并放到合适的实体类中。
     */
    @Override
    public void characters(char[] ch, int start, int length)
    throws SAXException {
    // TODO Auto-generated method stub
    String theString = new String(ch, start, length);
    switch (currentstate) {
    case Currentstate.Islogin:
    infoItem.setIslogin(Boolean.parseBoolean(theString));
    currentstate = 0;
    break;
    case Currentstate.OrgID:
    infoItem.setOrgID(Integer.parseInt(theString));
    currentstate = 0;
    break;
    case Currentstate.OrgName:
    infoItem.setOrgName(theString);
    currentstate = 0;
    break;
    case Currentstate.UserID:
    infoItem.setUserID(Integer.parseInt(theString));
    currentstate = 0;
    break;
    case Currentstate.UserName:
    infoItem.setUserName(theString);
    currentstate = 0;
    break; default:
    return;
    }
    } class Currentstate { public static final int OrgName = 5;
    public static final int OrgID = 4;
    public static final int UserName = 3;
    public static final int UserID = 2;
    public static final int Islogin = 1; }
    }解析的时候这样做 String str = "";//你的字符串
    SAXParser parser = null;
    List<LoginInfo> list = null; try {
    parser = SAXParserFactory.newInstance().newSAXParser();
    LoginInfoSAXHanlder parseXml = new LoginInfoSAXHanlder();
    InputStream stream = new ByteArrayInputStream(str.getBytes());
    parser.parse(stream, parseXml);
    list = parseXml.getFeed();
    } catch (Exception e) {
    }
    其中LoginInfo是XML文件的实体类, 这个不用我说了吧.
      

  8.   

     考虑性能的话还是用PULL解析吧.  http://blog.csdn.net/hosterzhu/article/details/6157274
      

  9.   

    考虑用XPath,你的pseudo-code是这样的:html->body->div#wraper->div#col x8 black-> div#side-vox last10-> 
        ul#sidebarlist -> li#first直接转换为以下XPath表达式:/html/body/div[@id='wraper']/div[@class='col x8 black']/
        div[@class='side-vox last10']/ul[@class='sidebarlist']/li[@class='fisrt']或者更简洁的:/html/body/div[1]/div[4]/div[1]/div[1]/ul[1]/li[1]