2015-11-08 183 views
0

我试图解析这个Java XML http://www.bnr.ro/nbrfxrates.xml,我想提取选择curency的速度,这是我迄今所做的,它是不工作...你能告诉我是什么正确的方法来达到汇率并在交换机内打印出来? PS:xml将使用加载:Java的XML解析问题

public static void main(String[] args) throws SAXException, IOException { 
    URL oracle = new URL("http://www.bnr.ro/nbrfxrates.xml"); 
    URLConnection yc = oracle.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(
          yc.getInputStream())); 
    String inputLine; 
    while ((inputLine = in.readLine()) != null) 
     System.out.println(inputLine); 
    in.close(); 





Scanner keyboard = new Scanner(System.in); 
    System.out.println("What currency rate do you need?"); 
    String myString; 
    myString = keyboard.nextLine(); 
    System.out.println("myint: " + myString); 

    String ales = myString; 

    switch(ales){ 
     case "USD": 
      final Pattern pattern = Pattern.compile("<Rate>(.+?)</Rate>"); 
      final Matcher matcher = pattern.matcher("<Rate></Rate>"); 
      matcher.find(); 
      System.out.println(matcher.group(1)); 

      break; 


     default: 
      System.out.println("We don't know"); 
+0

您不会将inputLine传递给匹配器。 inputLine将只包含url的最后一行 –

+0

你在哪里设置“选择”? – Thevenin

+0

解析XML的正确方法是用CAL解析:见https://docs.oracle.com/cd/B28359_01/appdev.111/b28394/adx_j_parser.htm – Thevenin

回答

1

没有XML解析,你可以更改您的代码是这样的 - 这将提取仅基于正则表达式正确的货币:

import java.net.*; 
import java.io.*; 
import java.util.*; 
import java.util.regex.*; 

public class currency { 
public static void main(String[] args) throws Exception { 
    URL oracle = new URL("http://www.bnr.ro/nbrfxrates.xml"); 
    URLConnection yc = oracle.openConnection(); 
    StringWriter sw = new StringWriter(); 
    PrintWriter pw = new PrintWriter(sw); 
    BufferedReader in = new BufferedReader(new InputStreamReader(
          yc.getInputStream())); 
    String inputLine; 
    while ((inputLine = in.readLine()) != null) { 
     System.out.println(inputLine); 
     pw.println(inputLine); 
    } 
    in.close(); 
    pw.close(); 
    sw.close(); 

    String data = sw.toString(); 

    Scanner keyboard = new Scanner(System.in); 
    System.out.println("What currency rate do you need?"); 
    String myString; 
    myString = keyboard.nextLine(); 
    keyboard.close(); 
    System.out.println("myint: " + myString); 

    String ales = myString; 

    Pattern pattern = Pattern.compile("<Rate currency=\""+ales+"\">(.+?)</Rate>"); 
    Matcher matcher = pattern.matcher(data); 
    matcher.find(); 
    System.out.println(matcher.group(1)); 
    System.out.println(Double.valueOf(matcher.group(1))); 
    } 
} 

原因饲养的发作为字符串的XML不是最好的方法来做到这一点 - 正则表达式解析。

但你可以尝试并从那里优化。喜欢:将货币放入地图,然后将其用于进一步处理:

Map<String,Double> currencies = new HashMap<String,Double>(); 
    Pattern pattern = Pattern.compile("<Rate currency=\"([^\"]{3})\">(.+?)</Rate>"); 
    Matcher matcher = pattern.matcher(data); 
    int pos = 0; 
    while(matcher.find(pos)) { 
     System.out.println("Found: " + matcher.group(1) + ": " + Double.valueOf(matcher.group(2))); 
     currencies.put(matcher.group(1), Double.valueOf(matcher.group(2))); 
     pos = matcher.end(); 
    } 

    Scanner keyboard = new Scanner(System.in); 

    boolean ok = true; 
    while(ok) { 
     System.out.println("What currency rate do you need? (QUIT to quit)"); 
     String cur = keyboard.nextLine(); 
     System.out.println("Rate for " + cur + " is " + currencies.get(cur)); 
     if("QUIT".equalsIgnoreCase(cur)) { 
     ok = false; 
     } 
    }  
    keyboard.close(); 
+0

你好janschweizer,它的工作原理,它了巨大的谢谢非常感谢您的帮助! – AleXzpm

+0

对不起,我试过投票,它告诉我,我需要一个15代表mininum,它看起来像接受没有这个限制。再次感谢你的帮助 – AleXzpm