2017-09-26 3 views
1

私は、.xmlファイルにというURLのファイルを記入する必要がある気象アプリケーションを構築しています。URLから.xmlファイルを埋める方法は?

XMLファイルのURLはhttp://vrijeme.hr/hrvatska_n.xmlある、と私はNewFile.xmlという名前のファイルを作成しました。

このURLデータをマニュアルでダウンロードしてEclipse IDEにインポートすると、正常に動作します。しかし、私はリモートリソースのlasコンテンツを持つことはできません。 、それはJava 8 nio APIを使用しています

String readXML = null; 
URL url = null; 
URLConnection urlconn = null; 

try { 
    url = new URL("http://vrijeme.hr/hrvatska_n.xml"); 
    urlconn = url.openConnection(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

try { 
    InputStreamReader inst = new InputStreamReader(urlconn.getInputStream()); 
    BufferedReader bfr = new BufferedReader(inst); 
    boolean eof = false; 
    while (!eof) { 
     readXML = bfr.readLine(); 
     if (readXML == null) { 
      eof = true; 
     } 
    } 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

try { 
    FileOutputStream fout = new FileOutputStream("NewFile.xml"); 
    Writer out = new OutputStreamWriter(fout, "UTF8"); 
    out.write(readXML); 
} catch (IOException z) { 
    System.out.println("Nešto se sjebalo."); 
} 

try { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    Document doc = builder.parse("NewFile.xml");           //Dokument 

    NodeList cityList = doc.getElementsByTagName("GradIme"); 
    Node cNode = cityList.item(12); 

    if (cNode.getNodeType() == Node.ELEMENT_NODE) { 

     Element cElement = (Element) cNode; 
     String city = cElement.getTextContent(); 
     System.out.println("Ime grada: " + city); 
    } 

    NodeList tempList = doc.getElementsByTagName("Temp");        //Element po nazivu 
    Node nNode = tempList.item(12);              //Item number 

    if (nNode.getNodeType() == Node.ELEMENT_NODE) {          // provjeta tipa podataka == Element 

     Element eElement = (Element) nNode;           // Element nNode 
     String temperatura = eElement.getTextContent();         //uzima text iz elementa 
     System.out.println("Temperatura:" + temperatura + " C"); 

     NodeList vlagaList = doc.getElementsByTagName("Vlaga"); 
     Node vNode = vlagaList.item(12); 

     if (vNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element vElement = (Element) vNode; 
      String vlaga = vElement.getTextContent(); 
      System.out.println("Vlaga u zraku: " + vlaga + "%"); 
     } 
    } 
} catch (ParserConfigurationException | IOException | SAXException e) { 
    e.printStackTrace(); 
} 
+0

あなたのコードの何が問題になっているのですか?あなたはエラーになる?または予期せぬ結果がありますか?これは私が得るものですVrijemeDanas.main(VrijemeDanas.java:68) – talex

+0

例外java.io.Writer.writeで "メイン" のjava.lang.NullPointerException \t(不明なソース) \t。 NewFile.xmlにデータを書き込もうとしたときのOutputStreamの行 –

+0

のスレッドで –

答えて

0

あなたはクリーンアップにごmain方法を管理する必要があります:あなたは、ほぼあなたがファイルをターゲットにすることを書き込もうとしているときnullreadXml入力になり、ファイルの読み書きのためのコード・ブロックを分離しています。あなたのソースコードを少し変更したバージョンダウンここ

は:

public static void main(String[] args) { 
    String readXML; 
    URL url; 
    URLConnection urlconn; 

    try { 
     url = new URL("http://vrijeme.hr/hrvatska_n.xml"); 
     urlconn = url.openConnection(); 

     BufferedReader bfr = null; 
     InputStreamReader inst = null; 
     FileOutputStream fout = null; 
     Writer out = null; 
     try { // read & write in the same block 
      inst = new InputStreamReader(urlconn.getInputStream()); 
      bfr = new BufferedReader(inst); 
      fout = new FileOutputStream("NewFile.xml"); 
      out = new OutputStreamWriter(fout, "UTF8"); 
      while ((readXML = bfr.readLine()) != null) { 
       out.write(readXML); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } finally { // cleanup your resources 
      if (out != null) { 
       out.close(); 
      } 
      if (fout != null) { 
       fout.close(); 
      } 
      if (bfr != null) { 
       bfr.close(); 
      } 
      if (inst != null) { 
       inst.close(); 
      } 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse("NewFile.xml");           //Dokument 

     NodeList cityList = doc.getElementsByTagName("GradIme"); 
     Node cNode = cityList.item(12); 

     if (cNode.getNodeType() == Node.ELEMENT_NODE) { 

      Element cElement = (Element) cNode; 
      String city = cElement.getTextContent(); 
      System.out.println("Ime grada: " + city); 
     } 

     NodeList tempList = doc.getElementsByTagName("Temp");        //Element po nazivu 
     Node nNode = tempList.item(12);              //Item number 

     if (nNode.getNodeType() == Node.ELEMENT_NODE) {          // provjeta tipa podataka == Element 

      Element eElement = (Element) nNode;           // Element nNode 
      String temperatura = eElement.getTextContent();         //uzima text iz elementa 
      System.out.println("Temperatura:" + temperatura + " C"); 

      NodeList vlagaList = doc.getElementsByTagName("Vlaga"); 
      Node vNode = vlagaList.item(12); 

      if (vNode.getNodeType() == Node.ELEMENT_NODE) { 

       Element vElement = (Element) vNode; 
       String vlaga = vElement.getTextContent(); 
       System.out.println("Vlaga u zraku: " + vlaga + "%"); 
      } 
     } 
    } catch (ParserConfigurationException | IOException | SAXException e) { 
     e.printStackTrace(); 
    } 
} 
+0

これは実験的なコードスニペットでなければならないことに注意してください。プロダクション対応のコードが必要な場合は、さらにクリーンアップを管理する必要があります。 リソースのクリーンアップに特に注意してください。 – tmarwen

1

あなたはこのコードを試すことができます。

以下は私が使用しているコードの一部です。

public void downloadFile(final String url, final String targetPath) throws IOException { 

    final URL website = new URL(url); 
    final Path target = Paths.get(targetPath); 
    System.out.println(target.toAbsolutePath().toString()); 
    try (InputStream in = website.openStream()) { 
     Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING); 
    } 
} 

//You can call the function 
downloadFile("http://vrijeme.hr/hrvatska_n.xml", "NewFile.xml");