Java SAX解析器-NumberFormatException
我尝试使用SAX解析器解析下一个xml文档: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>
<?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文件与我的文章完全相同。