2016-05-31 26 views
0

Ich versuche nächste XML-Dokument von SAX-Parser zu analysieren:SAX-Parser - Number

<?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> 

Es ist in Zeichen:

if (thisElement.equals("numberOfDancers")) { 
    dance.setNumberOfDancers(new Integer((new String(ch, start, length)))); 
} 

und das ist, was ich habe:

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); 

Wo könnte das Problem sein?

+0

Um eine bessere Antwort zu erhalten, zeigen Sie Ihren ContentHandler-Code. –

Antwort

0

In Ihrem Code versuchen Sie, einen Teilstring new String(ch, start, length) zu einem Integer zu analysieren. Number sagen Sie einfach, was es sagt - Zeilenumbrüche können nicht als Zahl interpretiert werden:

java.lang.NumberFormatException: For input string: " 

" 

Dies kann auftreten, wenn Sie so etwas wie dies in Ihrem xml haben:

... 
<scene>assembly hall</scene> 
<numberOfDancers> 
</numberOfDancers> 
<music>phonogram</music> 
... 

Überprüfen Sie Ihre XML-Eingabe.

+0

Danke für die Antwort, aber ich habe keine neuen Zeilen zwischen den Tags. Meine XML-Datei ist genau wie in meinem Post. – savelich

0

Ihr Elemententext in der Variablen thisElement ist nicht mit dem synchron, was Sie Ihrer Meinung nach in der XML-Datei befinden. Aus der Fehlermeldung geht hervor, dass es an der Stelle, an der es eine Zahl halten soll, eine Folge von Leerzeichen mit Zeilenumbrüchen enthält, wobei dieser Datenstrom wahrscheinlich der Elementtext vor dem aktuellen Element ist.

Sie zeigen Ihren Content-Handler nicht an und wie er thisElement initialisiert oder wie Sie Ihren Standort im Dokument verfolgen, was notwendig wäre, um dies weiter zu diagnostizieren.

Offensichtlich stimmt Ihre Zeichenmethode nicht mit der SAX-Dokumentation überein. Die Zeichenmethode kann vom Parser mehrmals pro Element aufgerufen werden. Sie können nicht sicher sein, dass Sie den vollständigen Elementtext haben, bis die endElement-Methode aufgerufen wird. Siehe the Oracle tutorial:

Parsers müssen keine bestimmte Anzahl von Zeichen gleichzeitig zurückgeben. Ein Parser kann alles von einem einzelnen Zeichen bis zu mehreren tausend zurückgeben und trotzdem eine standardkonforme Implementierung sein. Wenn Ihre Anwendung also die angezeigten Zeichen verarbeiten muss, ist es ratsam, dass die characters() -Methode die Zeichen in einem java.lang.StringBuffer ansammelt und sie nur bearbeitet, wenn Sie sicher sind, dass alle gefunden wurden.

Die Methode characters sollte nichts anderes tun, als den Inhalt in einem Puffer zu speichern (z. B. an einen StringBuilder anhängen). Suchen Sie nach den Werten in der endElement-Methode (trimmen Sie Leerzeichen, bevor Sie sie als Zahl analysieren), und leeren Sie dann den Puffer.

Hier ist ein Beispiel, wie ein ContentHandler funktionieren kann. Es speichert seine Position in der gelesenen XML-Datei und speichert den Elementtext so lange, bis er das Ende eines Elements erreicht, wenn es mit dem Text einer Eigenschaft des Objekts basierend auf dem aktuellen Pfad übereinstimmt:

}