2013-10-01 4 views
2

Я создаю приложение, которое будет загружать большое количество файлов с моего собственного веб-сервера. Но idk, почему он не работает. Он не имеет никакого ответа ..Java - XML ​​Parser & Downloader

Вот какая-то часть моего кода

Downloader.class

private Proxy proxy = Proxy.NO_PROXY; 
    public void downloadLibrary() 
     { 
      System.out.println("Start downloading libraries from server..."); 
      try 
      { 
       URL resourceUrl = new URL("http://www.example.com/libraries.xml"); 
       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
       DocumentBuilder db = dbf.newDocumentBuilder(); 
       Document doc = db.parse(resourceUrl.openConnection(proxy).getInputStream()); 
       NodeList nodeLst = doc.getElementsByTagName("Contents"); 
       for (int i = 0; i < nodeLst.getLength(); i++) 
       { 
        Node node = nodeLst.item(i); 

        if (node.getNodeType() == 1) 
        { 
         Element element = (Element)node; 
         String key = element.getElementsByTagName("Key").item(0).getChildNodes().item(0).getNodeValue(); 
         File f = new File(launcher.getWorkingDirectory(), key); 
         downloadFile("http://www.example.com/" + key, f, "libraries"); 
        } 
       } 
      } 
      catch(Exception e) 
      { 
       System.out.println("Error was found when trying to download libraries file " + e); 
      } 

     } 

     public void downloadFile(final String url, final File path, final String fileName) 
     { 
      SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() 
      { 
       @Override 
       protected Void doInBackground() throws Exception 
       { 
        launcher.println("Downloading file " + fileName + "..."); 
        try 
        { 
         URL fileURL = new URL(url); 
         ReadableByteChannel rbc = Channels.newChannel(fileURL.openStream()); 
         FileOutputStream fos = new FileOutputStream(path); 
         fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
        } 
        catch(Exception e) 
        { 
         System.out.println("Cannot download file : " + fileName + " " + e); 
        } 
        return null; 
       } 
       @Override 
       public void done() 
       { 
        System.out.println(fileName + " had downloaded sucessfully"); 

       } 
      }; 
      worker.execute(); 
     } 

Вот какая-то часть моего XML-файл (libraries.xml)

<Key>libraries/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar</Key> 

Моя идея в том, что мое приложение будет читать XML-файл. Затем он загрузит файл с сервера и сохранит его на компьютере. Например, мое приложение загружает http://www.example.com/libraries/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar, затем оно сэкономит C://WorkingDir/libraries/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar В моем файле XML есть тонна <Key></Key>, и я должен загрузить все это.

Это что-то неправильное? Спасибо за помощь.

+0

Ааааа! у вас есть C в вашей Java !!!!! – SnakeDoc

+0

@SnakeDoc Что вы имели в виду? – Jeremy

+0

Lol, шутить, конечно. В java, большую часть времени вы видите фигурные скобки {на одной строке, а не на следующей строке. обычно, когда вы видите на следующей строке, это либо студент (поскольку ученые обычно следуют шаблону следующей строки), либо кто-то, у кого есть родной язык C. Не всегда, но только мое наблюдение. ;) – SnakeDoc

ответ

1

Попробуйте использовать соединение непосредственно через считывающее устройство какого-либо типа в строку, тогда вы можете манипулировать тем, что вам нужно.

package come.somecompany.somepackage.utils; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 

public class WebUtils { 

    /** 
    * Gets the HTML value of a website and 
    * returns as a string value. 
    * 
    * @param website website url to get. 
    * @param ssl True if website is SSL. 
    * @param useragent Specified User-Agent (empty string "" means use system default). 
    * @return String value of website. 
    */ 
    public String getHTML(String website, boolean ssl, String useragent) { 
     String html = ""; 
     String temp; 
     String prefix; 
     if (ssl) { 
      prefix = "https://"; 
     } else { 
      prefix = "http://"; 
     } 
     try { 
      URL url = new URL(prefix + website); 
      URLConnection con = url.openConnection(); 
     if (!(useragent.equalsIgnoreCase(""))) { 
      con.setRequestProperty("User-Agent", useragent); 
     } 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(con.getInputStream())); 
     while((temp = in.readLine()) != null) { 
      html += temp + "\n"; 
     } 
     in.close(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return html; 
    } 
} 

Кроме того, он вроде выглядит как будто вы пытаетесь разобрать HTML с помощью XML-шаблон ..., который может дать вам трудности. Вы можете попробовать JSoup - это java-анализатор HTML, и он работает очень хорошо и легко: http://jsoup.org/

Это может помочь с потреблением документов с вашего сайта без необходимости создавать собственный загрузчик.

UPDATE --

Попробуйте прочитать в BufferedReader, возможно, ваша программа не получает полный текст документа, буферный читатель может помочь.

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 

Так с первым методом, что-то вроде:

public void downloadLibrary() 
    { 
     System.out.println("Start downloading libraries from server..."); 
     try 
     { 
      URL resourceUrl = new URL("http://www.example.com/libraries.xml"); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 

      // change here 
      URLConnection con = resourceUrl.openConnection(); 
      BufferedReader bfr = new BufferedReader(new InputStreamReader(con.getInputStream())); 

      String tempDoc = ""; 
      String tempStr; 
      while (tempStr = bfr.readLine()) != null) { 
       tempDoc += tempStr + System.getProperty("line.separator"); 
      } 

      Document doc = db.parse(tempDoc); 

      NodeList nodeLst = doc.getElementsByTagName("Contents"); 
      for (int i = 0; i < nodeLst.getLength(); i++) 
      { 
       Node node = nodeLst.item(i); 

       if (node.getNodeType() == 1) 
       { 
        Element element = (Element)node; 
        String key = element.getElementsByTagName("Key").item(0).getChildNodes().item(0).getNodeValue(); 
        File f = new File(launcher.getWorkingDirectory(), key); 
        downloadFile("http://www.example.com/" + key, f, "libraries"); 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      System.out.println("Error was found when trying to download libraries file " + e); 
     } 

    } 
+0

Мне нужно разобрать XML-документ, и мне также необходимо загрузить файлы ... – Jeremy

+0

- это фактический XML или HTML, который вы используете синтаксический разбор XML?В любом случае использование DOM для синтаксического анализа xml - это длинный путь (очень многословный и много кода котельной таблички, а также для больших XML-документов, он не очень эффективен, так как он должен хранить весь документ в памяти во время разбора). Лично я недавно переключился на JAXB и полюбил его, но его тоже много настроить. SAX parser imho проще всего настроить, как только вы его узнаете, и это очень быстро. - это не имеет ничего общего с вашей проблемой подключения, но я думал, что просто выброшу туда; -P – SnakeDoc

+0

это фактический XML. И мой XML не очень большой, это всего около 500 КБ. Я предпочитаю использовать DOM cuz DOM легко – Jeremy