【问题标题】:SAX Parser Error [closed]SAX 解析器错误 [关闭]
【发布时间】: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 方法中找到下一个&lt;package&gt;...

标签: java xml xml-parsing sax


【解决方案1】:

请尝试以下代码并在最大元素之一中输入空字符串,与您相同的错误 写出现。无论如何,您为什么要使用缓冲区?试试 String maxString = new String(ch, start, length)。

打包 XmlTest;

导入 javax.xml.parsers.; 导入 org.xml.sax。; 导入 org.xml.sax.helpers.*;

公共类 SAXTest { 私有静态最终字符串空间=“”; private static final String MAX = "Max";

public static void main(String[] args) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {
        boolean maxElement = false;

        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

            if (qName.equalsIgnoreCase(MAX)) {
                maxElement = true;
            }

        }

        public void endElement(String uri, String localName, String qName) throws SAXException {
        }

        public void characters(char ch[], int start, int length) throws SAXException {

            if (maxElement) {
                String maxString = new String(ch, start, length);
                Double maxDouble = Double.parseDouble(maxString);
                System.out.println(MAX + SPACE + maxDouble);
                maxElement = false;
            }
        }
    };

    saxParser.parse("your_xml_file.xml", handler);
}

}

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2011-09-23
    • 2012-03-01
    • 2013-12-05
    相关资源
    最近更新 更多