Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SAX解析器-NumberFormatException_Java_Xml_Sax_Saxparser - Fatal编程技术网

Java SAX解析器-NumberFormatException

Java SAX解析器-NumberFormatException,java,xml,sax,saxparser,Java,Xml,Sax,Saxparser,我尝试使用SAX解析器解析下一个xml文档: <?xml version="1.0" encoding="UTF-8" ?> <dance title="foxtrot" id="1"> <type>ballroom</type> <scene>assembly hall</scene> <numberOfDancers>10</numberOfDancers>

我尝试使用SAX解析器解析下一个xml文档:

<?xml version="1.0" encoding="UTF-8" ?>

<dance title="foxtrot" id="1">

    <type>ballroom</type>

    <scene>assembly hall</scene>

    <numberOfDancers>10</numberOfDancers>

    <music>phonogram</music>

    <dancers>
        <dancer>Ivanov Ivan</dancer>
        <dancer>Petrova Ludmila</dancer>
    </dancers>

    <number>22</number>

</dance>
这就是我得到的:

java.lang.NumberFormatException: For input string: "

    "
at     java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:569)
at java.lang.Integer.parseInt(Integer.java:615)
at parsers.SAXParser.characters(SAXParser.java:58)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.characters(AbstractSAXParser.java:546)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:463)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at     com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:328)
at Main.main(Main.java:37)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)




Integer.java:569  is next:
     } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

问题出在哪里?

在代码中,您试图将子字符串
新字符串(ch,start,length)
解析为整数。NumberFormatException只是告诉您它所说的-换行符不能解释为数字:

java.lang.NumberFormatException: For input string: "

"
如果xml中有类似的内容,则可能会发生这种情况:

...
<scene>assembly hall</scene>
<numberOfDancers>
</numberOfDancers>
<music>phonogram</music>
...
。。。
礼堂
唱片
...

检查xml输入。

在代码中,您试图将子字符串
新字符串(ch,start,length)
解析为整数。NumberFormatException只是告诉您它所说的-换行符不能解释为数字:

java.lang.NumberFormatException: For input string: "

"
如果xml中有类似的内容,则可能会发生这种情况:

...
<scene>assembly hall</scene>
<numberOfDancers>
</numberOfDancers>
<music>phonogram</music>
...
。。。
礼堂
唱片
...

检查xml输入。

变量
thismelement
中的元素文本与您认为当前在xml中的位置不同步。从错误消息中可以看出,它在预期保存数字的位置保存了一个带有换行符的空格字符串,其中空格流很可能是当前元素前面的元素文本

您的characters方法不符合SAX文档。解析器可以对每个元素多次调用characters方法,在调用endElement方法之前,您无法确保拥有完整的元素文本。见:

解析器不需要一次返回任何特定数量的字符。解析器一次最多可以返回几千个字符中的任何内容,并且仍然是符合标准的实现。因此,如果应用程序需要处理它看到的字符,明智的做法是让characters()方法将字符累积到java.lang.StringBuffer中,并仅在确定找到所有字符时对其进行操作

characters方法只能将内容保存在缓冲区中(例如附加到StringBuilder)。检查endElement方法中的值(在将其解析为数字之前修剪空白),然后清除缓冲区

下面是一个ContentHandler如何工作的示例。它跟踪其在正在读取的XML中的位置,并保存元素文本,直到它到达元素的末尾,然后根据当前路径将文本与对象的属性相匹配:

class DanceContentHandler extends DefaultHandler {

    private List tagStack = new ArrayList();
    private StringBuilder buffer = new StringBuilder();
    private Dance dance = new Dance();

    public void startElement(String namespaceURI, String localName,
    String qName, Attributes atts) throws SAXException {
        buffer.clear();
        tagStack.add(localName);
        if ("[dance]".equals(tagStack.toString()) {
            // populate title and id of dance object from atts
        }
    }

    public void endElement(String namespaceURI, String localName, 
    String qName) throws SAXException  {
        String text = buffer.toString().trim();
        switch (tagStack.toString()) {
            case "[dance, type]":
                dance.setType(text);
                break;
            case "[dance, scene]":
                dance.setScene(text);
                break;
            case "[dance, numberOfDancers]":
                dance.setNumberOfDancers(Integer.parseInt(text));
                break;
            case "[dance, music]":
                dance.setMusic(text);
                break;
            case "[dance, dancers, dancer]":
                dance.getDancers().add(text);
                break;
            case "[dance, number]":
                dance.setNumber(Integer.parseInt(text));
                break;
        }
        buffer.clear();       
        tagStack.remove(tagStack.size() - 1);
    }

    public void characters(char[] ch, int start, int length) 
    throws SAXException {
        buffer.append(new String(ch, start, length));
    }

    // return populated domain object
    public Dance getDance() { 
        return dance; 
    }

}

变量
thismelement
中的元素文本与您认为在xml中的当前位置不同步。从错误消息中可以看出,它在预期保存数字的位置保存了一个带有换行符的空格字符串,其中空格流很可能是当前元素前面的元素文本

您的characters方法不符合SAX文档。解析器可以对每个元素多次调用characters方法,在调用endElement方法之前,您无法确保拥有完整的元素文本。见:

解析器不需要一次返回任何特定数量的字符。解析器一次最多可以返回几千个字符中的任何内容,并且仍然是符合标准的实现。因此,如果应用程序需要处理它看到的字符,明智的做法是让characters()方法将字符累积到java.lang.StringBuffer中,并仅在确定找到所有字符时对其进行操作

characters方法只能将内容保存在缓冲区中(例如附加到StringBuilder)。检查endElement方法中的值(在将其解析为数字之前修剪空白),然后清除缓冲区

下面是一个ContentHandler如何工作的示例。它跟踪其在正在读取的XML中的位置,并保存元素文本,直到它到达元素的末尾,然后根据当前路径将文本与对象的属性相匹配:

class DanceContentHandler extends DefaultHandler {

    private List tagStack = new ArrayList();
    private StringBuilder buffer = new StringBuilder();
    private Dance dance = new Dance();

    public void startElement(String namespaceURI, String localName,
    String qName, Attributes atts) throws SAXException {
        buffer.clear();
        tagStack.add(localName);
        if ("[dance]".equals(tagStack.toString()) {
            // populate title and id of dance object from atts
        }
    }

    public void endElement(String namespaceURI, String localName, 
    String qName) throws SAXException  {
        String text = buffer.toString().trim();
        switch (tagStack.toString()) {
            case "[dance, type]":
                dance.setType(text);
                break;
            case "[dance, scene]":
                dance.setScene(text);
                break;
            case "[dance, numberOfDancers]":
                dance.setNumberOfDancers(Integer.parseInt(text));
                break;
            case "[dance, music]":
                dance.setMusic(text);
                break;
            case "[dance, dancers, dancer]":
                dance.getDancers().add(text);
                break;
            case "[dance, number]":
                dance.setNumber(Integer.parseInt(text));
                break;
        }
        buffer.clear();       
        tagStack.remove(tagStack.size() - 1);
    }

    public void characters(char[] ch, int start, int length) 
    throws SAXException {
        buffer.append(new String(ch, start, length));
    }

    // return populated domain object
    public Dance getDance() { 
        return dance; 
    }

}

谢谢您的回答,但我没有在标签之间添加新行标志。我的xml文件和我的帖子完全一样。谢谢你们的回答,但我并没有在标签之间添加新的换行符。我的xml文件与我的文章完全相同。