Java的XML解析问题
问题描述:
我试图解析这个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");
答
没有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();
您不会将inputLine传递给匹配器。 inputLine将只包含url的最后一行 –
你在哪里设置“选择”? – Thevenin
解析XML的正确方法是用CAL解析:见https://docs.oracle.com/cd/B28359_01/appdev.111/b28394/adx_j_parser.htm – Thevenin