2012-05-11 3 views
0

Я пытаюсь загрузить XML-файл для анализа с сервера, но сервер не отправляет HTTP-заголовки, а просто XML-текст. Я пробовал почти каждый метод загрузки файлов с URL-адресом, который я могу найти, но все дает мне исключение ввода-вывода. Я могу загрузить файл в WebView, но я не могу загрузить файл сам.Как загрузить xml-файл с сервера без заголовков http

Как я могу открыть соединение и загрузить XML-файл без заголовков HTTP?

EDIT: Тем не менее дает мне исключение I/O, вот код, я использую:

private class UpdateTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void...voids) { 
     String url = "http://192.168.1.92/state.xml"; 
     try{ 
      //get XML Pull parser 
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      //factory.setValidating(false); 
      XmlPullParser xpp = factory.newPullParser();   

      HttpGet httpGet = new HttpGet(url); 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpResponse response = client.execute(httpGet); 

      if(response == null) return null; 

      HttpEntity httpEntity = response.getEntity(); 
      InputStream inStream = null; 
      StringBuilder sb  = null; 
      if (httpEntity == null) return null; 

      try { 
       inStream = httpEntity.getContent(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "UTF-8")); 
       sb = new StringBuilder(); 
       String line = null; 

       while((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 

       inStream.close(); 
       } catch (Exception ex) { 
       } 
       String xmlString = sb.toString(); 

       xpp.setInput(new StringReader(xmlString)); 
       int eventType = xpp.getEventType(); 

       String name = null; 
       String text = null; 
       while (eventType != XmlPullParser.END_DOCUMENT) { 
        if(eventType == XmlPullParser.START_TAG) { // <name> 
         name = xpp.getName(); 
         System.out.println("got name: " + name); 
        } else if(eventType == XmlPullParser.END_TAG) {// </name> (xpp.getName(); 
        } else if(eventType == XmlPullParser.TEXT) { // <>text</> 
         text = xpp.getText(); 
         System.out.println("got text: " + text); 

        } 
        eventType = xpp.next(); 
       } 
       finished = true; 
      }catch(MalformedURLException e){ 
       System.out.println("Malformed URL"); 
      }catch(IOException e){ 
       System.out.println("IO Exception updating " + name + " at address: " + address); 
      }catch(XmlPullParserException e){ 
       System.out.println("XML Pull Parser Error updating " + name + " at address: " + address); 
      }catch(Exception e){ 
      } 
     return null; 
    } 
} 

дает мне исключение ввода/вывода каждый раз. Однако, если я укажу его на сервер, который предоставляет HTTP-заголовок, он загружается просто отлично. Серверы - это устройства, которые мы создаем внутри компании, а старые устройства не предоставляли заголовки HTTP при запросе файла state.xml, поэтому мне нужно иметь возможность работать с обоими.

+0

Найти/прочитать статьи о том, как задавать вопросы. Ваш вопрос должен быть конкретным, насколько это возможно. Вы должны предоставить как можно больше информации о проблеме. – Maxim

+0

Если вы загрузите http://192.168.1.92/state.xml в свой браузер, и он вернет вам xml, тогда поставьте точку останова в первой строке в разделе try и узнайте, что вызывает исключение, или опубликуйте свой LogCat здесь. – Maxim

+0

. браузер отлично возвращает XML-страницу. iOS также подключается и загружается отлично, а WebViews также отображает XML. В коде он генерирует исключение ввода-вывода при открытии InputStream или в этом случае, когда я выполняю client.execute (httpGet); Мой logcat просто возвращает System.out.println («Исключение I/O»); даже со строгим режимом. Есть ли способ получить более подробный отчет об ошибке? – daven3t

ответ

0

я должен был открыть свой собственный сокет, создать HTTP Get запрос, а затем удалить заголовки HTTP для серверы, у которых есть заголовки.

 public String getData(){ 
     String returnData = ""; 
     String requestmsg = "GET /state.xml HTTP/1.0\r\n"; 
     requestmsg += "Connection: close\r\n"; 
     if(cpPassword != null) 
      requestmsg += "Authorization: Basic " + Base64.encodeBytes(("admin:" + cpPassword).getBytes()) + "\r\n"; 
     requestmsg += "\r\n"; 

     int intPort = 80; 
     DataOutputStream dos = null; 
     BufferedReader dis = null; 
     Socket socket = null; 
     try { 
      socket = new Socket(address, intPort); 
      String data = ""; 
      socket.setSoTimeout(3000); //timeout after 2 seconds 
      dos = new DataOutputStream(socket.getOutputStream()); 
      dis = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      dos.write(requestmsg.getBytes()); 

      StringBuilder sb = new StringBuilder(); 

      while ((data = dis.readLine()) != null) { 
       sb.append(data); 
      } 
      returnData = sb.toString(); 
      if(returnData.length() == 0) 
       return ""; 
      int xmlIndex = returnData.indexOf("<?xml"); 
      returnData = returnData.substring(xmlIndex); 
      return returnData; 
     } catch (IOException e) { 
      Log.e("ClientActivity", "C: Error Getting Data From Socket", e); 
      returnData = ""; 
     }finally{ 
      try{ 
       if(socket!=null) 
        socket.close(); 
      }catch(IOException e){ 
       Log.e("ClientActivity", "C: Error Closing Socket", e); 
      } 
     } 
     return returnData; 
    } 
0

Посмотрите документацию, как правильно настроить подключение, на короткое время вы будете иметь что-то вроде этого:

HttpGet httpGet = new HttpGet(mServerUrl); 
DefaultHttpClient client = new DefaultHttpClient(); 
HttpResponse response = client.execute(httpGet); 

if(response == null) return; 

HttpEntity httpEntity = response.getEntity(); 
InputStream inStream = null; 
StringBuilder sb  = null; 
if (httpEntity == null) return; 

try { 
    inStream = httpEntity.getContent(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "UTF-8")); 
    sb = new StringBuilder(); 
String line = null; 

while((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 

inStream.close(); 
} catch (Exception ex) { 
} 
String xmlString = sb.toString(); 
Смежные вопросы