【发布时间】:2013-02-08 10:51:53
【问题描述】:
首先,这是一个困扰我的 XML 文件的 sn-p。完整的 XML 文件非常大,包含许多不同名称的“包”。
<repo version="2">
<package name="packageNameHere">
<author>Some Author</author>
<version>0.1</version>
<description>A description</description>
<dependencies/>
<API>
<max>0.1</max>
<min>0.1</min>
</API>
<download>
http://www.somedownload.com/downloadfile.jar
</download>
</package>
</repo>
程序对 XML 文件进行初始扫描并获取所有包名称的列表。然后要求用户输入包名称。此DefaultHandler 用于查找有关该软件包的信息。
private String packageToFind = null, currentElement = "";
public Package locatedPack = null;
private boolean finished = false;
private StringBuffer buffer = new StringBuffer();
public PackageSearchingRepoXMLHandler(String PackageToFind) {
this.packageToFind = PackageToFind;
}
@Override
public void startElement(String uri, String localName, String elementName, Attributes attributes) throws SAXException {
if(!finished && elementName.equals("package") && attributes.getValue("name").equals(packageToFind))
locatedPack = new Package(packageToFind);
else if(locatedPack != null && !finished) {
currentElement = elementName;
}
}
@Override
public void endElement(String uri, String localName, String elementName) throws SAXException {
if(locatedPack != null && !finished) {
switch(currentElement) {
case "author":
locatedPack.setAuthor(buffer.toString());
buffer = new StringBuffer();
break;
case "version":
locatedPack.setVersion(Double.parseDouble(buffer.toString()));
buffer = new StringBuffer();
break;
case "description":
locatedPack.setDescription(buffer.toString());
buffer = new StringBuffer();
break;
case "dependencies":
locatedPack.setDependencies(buffer.toString().split(", "));
buffer = new StringBuffer();
break;
case "max":
locatedPack.setApiMAX(Double.parseDouble(buffer.toString()));
buffer = new StringBuffer();
break;
case "min":
locatedPack.setApiMIN(Double.parseDouble(buffer.toString())); //This is line 157
buffer = new StringBuffer();
break;
case "download":
try {
locatedPack.setDownloadLink(new URL(buffer.toString()));
} catch (MalformedURLException e) {/* Won't happen */}
buffer = new StringBuffer();
break;
case "package":
finished = true;
default:
break;
}
}
}
@Override
public void characters(char[] ch, int start, int length) {
if (!finished)
buffer.append(new String(ch, start, length));
}
NumberFormatException 正在从 Double.parseDouble() 部分抛出;原因位是empty String。我不能给你一个具体的行号,因为控制台没有给我一个。
有谁知道这个恼人的错误导致我的程序不能正确输出数据的原因?困扰我很久了! :@
编辑
这是确切的堆栈跟踪(更多的是更少,我删除了所有的摇摆废话......):
java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at [removed class/package info].endElement(PackageHelper.java:157)
第 157 行在代码中突出显示。
【问题讨论】:
-
Xpath 肯定会更好用吗?
//package[@name=\""+packageToFind+"\"]会找到你想要的元素... -
也许你在一个 xml 元素中的某个地方有空格,你期望双精度值?示例:
_[space]0.1_[space]_ -
在解析文件中的第一个 时,变量 'finished' 被赋值为 true。随后,
characters方法中的if条件永远不会变为真,并且缓冲区永远不会再次填充。 -
@bmorris591 是的,它会... :/ 现在有点晚了
-
我认为@MartinEllis 建议您需要将其设置为
true,然后在您的startElement方法中找到下一个<package>...
标签: java xml xml-parsing sax