javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]

nieselfriem

Bekanntes Mitglied
Hallo,

ich will mit einer Methode eine im Web bereitgestellte XML-Datei herunter laden und den Stream gleich als XML wieder einlesen um ihn dann lokal weiter zu verarbeiten. Dazu habe ich folgende Klasse geschrieben

Java:
public class ImportXML {

    private final String USER_AGENT = "mozilla/5.0";

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        // TODO code application logic here
        ImportXML http = new ImportXML();
        XmlToSQL xmlsql = new XmlToSQL();
        InputStream in; 
        System.out.println("Testing - Send http Post request");
        in = http.sendPost();
        xmlsql.parseXML(in);
        
    }

    private  InputStream sendPost() throws Exception {
        String username ="georg";
        String password ="werner";
        String userpass = username + ":" + password;
        String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());
        String url = "http://localhost/dbxmlexport/";
        System.out.println("url");
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", USER_AGENT);
        con.setRequestProperty("Accept-Language", "en-US,en, q=0.5");
        con.setRequestProperty ("Authorization", basicAuth);
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes("");
        wr.flush();
        wr.close();
        int responseCode = con.getResponseCode();
        System.out.println("\nSending POST request tu URL : " + url);
        System.out.println("Response Code: " + responseCode);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
       

        //System.out.println(response.toString());
        Path target = Paths.get("c:/tmp/test.xml");
        InputStream is = new ByteArrayInputStream(response.toString().getBytes());
        Files.copy(is, target, StandardCopyOption.REPLACE_EXISTING);
      
        return con.getInputStream();
    }

}

Nun will ich den Inputstream in der unten stehenden Klasse aufnehmen lassen und gleich weiter verarbeiten, ohne die XML-Datei auf dem Filesystem zwischen zu speichern.

Java:
public class XmlToSQL {

    ArrayList<Countries> cnt = new ArrayList<Countries>();
    private String tag = "";
    private String wert = "";
    private InputStream is;

    public ArrayList parseXML(InputStream isp) {
        this.is = isp;
        
        try {
            XMLInputFactory iF = XMLInputFactory.newInstance();
            
            XMLStreamReader sr = iF.createXMLStreamReader(is);
            
            while(sr.hasNext()) {
                switch (sr.next()) {
                    case XMLStreamConstants.START_ELEMENT:
                        if (!sr.getLocalName().equals("Countries")) {
                            tag = sr.getLocalName().trim();
                        }//if
                        break;
                case XMLStreamConstants.END_ELEMENT:
                        if (sr.getLocalName().equals("Country")) {
                            tag = "endcountry";
                        }
                        wert = "";
                        break;
                 case XMLStreamConstants.CHARACTERS:
                        if (tag.equals("Country") && sr.getText().trim().length() > 0) {
                            wert = "*";
                        }//if
                        else {
                            if (sr.getText().trim().length() > 0) {
                                wert = sr.getText().trim();
                            }
                        }
                        if ((wert.length() > 0 && tag.length() > 0) || (wert.equals("") && tag.endsWith("bewerber"))) {
                            cnt.add(new Countries(tag, wert));
                        }
                        break;
                }
            }
            
        } catch (Exception e) {
            e.printStackTrace();

        }
        return cnt;
    }
}

Doch leider bekomme ich so die Exception,

Code:
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Vorzeitiges Dateiende.
	at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:601)
	at importxml.XmlToSQL.parseXML(XmlToSQL.java:31)
	at importxml.ImportXML.main(ImportXML.java:40)

Was muss ich da ändern?

VG niesel
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Die Message zeigt doch eindeutig, dass die Datei zu kurz ist. Du lässt dir auch nirgendwo den Inhalt der Datei ausgeben, um zu kontrollieren, ob da überhaupt was drinsteht. Das ist schon sehr leichtsinnig.
Mögliche Fehlerursachen: also ich kann da nur raten, weil ich mit HttpURLConnections noch nix gemacht habe
- Du öffnest einen OutputStream der connection und schreibst "" rein. K.A. ob damit ev. Inhalte "überschrieben" werden.
- Du verwendest den InputStream der connection als Eingabestrom für einen BufferedReader, mit dem ein StringBuffer gefüllt wird. Es wird solange aus dem InputStream gelesen, bis sein Ende erreicht ist. Am Ende der Methode gibst du wieder con.getInputStream zurück. Ev. fängt der ja nich noch mal von vorne an aus der Connection zu lesen?
- Wie sieht überhaupt die Datei auf "c:/tmp/test.xml" aus? Entgegen deiner Beschreibung wird offenbar doch eine Kopie der Datei auf die Festplatte geschrieben.
 

nieselfriem

Bekanntes Mitglied
Das da was drin steht ist sicher, da der Stream die Datei in ein Verzeichnis schreibt. Das wird in der Methode sendPost() mit den Zeilen
Java:
Path target = Paths.get("c:/tmp/test.xml");
        InputStream is = new ByteArrayInputStream(response.toString().getBytes());
        Files.copy(is, target, StandardCopyOption.REPLACE_EXISTING);
auch ausgeführt. Es ist auche eine Valide XML-Datei. Wenn ich den Umweg über eine Datei gehen, funktioniert das Einlesen der Datei im XMLStreamReader auch, nur wenn ich den Stream direkt ohne Umweg einfügen will nicht.
 

Harry Kane

Top Contributor
Das da was drin steht ist sicher, da der Stream die Datei in ein Verzeichnis schreibt. Es ist auche eine Valide XML-Datei. Wenn ich den Umweg über eine Datei gehen, funktioniert das Einlesen der Datei im XMLStreamReader auch, nur wenn ich den Stream direkt ohne Umweg einfügen will nicht.
Dann bleibt als Erklärung eigentlich nur noch übrig, daß der InputStream aus dem 2. Aufruf von con.getInputStream() leer ist. Das kannst du leicht überprüfen, indem du den an die parseXML methode übergegebenen InputStream in eine Datei speicherst und deren Inhalt kontrollierst.
Um den Fehler ganz zu umgehen, würde ich auf das mehrmalige Verwenden von con.getInputStream() verzichten, stattdessen den InputStream aus dem erstmaligen Lesen in ein byte Array einlesen und damit dann weiterarbeiten.
Dein aktueller Weg InputStream -> InputStreamReader -> BufferedReader -> StringBuffer -> String -> byte[] -> könnte stark verkürzt werden. So müsste das gehen:
Java:
    public byte[] readData(InputStream inputStream) throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[16384];
        int read = 0;
        while ((read = inputStream.read(buf)) != -1) {
            bos.write(buf, 0, read);
        }
        bos.flush();
        return bos.toByteArray();
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
jumichel Eclipse The package javax.mail is not accessible Allgemeine Java-Themen 3
T Erste Schritte mit javax.validation Allgemeine Java-Themen 5
severin_96 javax.crypto.IllegalBlockSizeException Allgemeine Java-Themen 7
pkm javax.script.ScriptEngineManager gibt mir keine Engine Allgemeine Java-Themen 4
C javax.mail.Message message.setreplyto() null setzen (keine replyto Adresse) Allgemeine Java-Themen 25
E javax.mail sene Type ändern Allgemeine Java-Themen 2
RalleYTN javax.vecmath Transformationsmatrix für LWJGL3 Allgemeine Java-Themen 2
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
U javax.mail.Folder.list() zeigt nicht alle Ordner Allgemeine Java-Themen 5
T javax.script (JavaScript): Nicht-JRE-Packages importieren/nutzen Allgemeine Java-Themen 4
buggy84 JavaX und win32comm.dll Allgemeine Java-Themen 3
Q javax.crypto.BadPaddingException - was ist das genau? Allgemeine Java-Themen 9
H Java Mail Fehlermeldung: java.lang.NoClassDefFoundError: javax/mail/internet/AddressException Allgemeine Java-Themen 5
G Wie installiere ich javax-usb unter windows? Allgemeine Java-Themen 0
B Javax.Sound Problem (setMessage-Methode) Allgemeine Java-Themen 2
P javax.mail MessageCount Allgemeine Java-Themen 13
I javax.sound.sampled.* - Hilfe zu den Controls Allgemeine Java-Themen 8
E NoClassDefFoundError: javax/microedition/io/Connection Allgemeine Java-Themen 2
J javax.comm findet serielle ports nicht Allgemeine Java-Themen 2
B Eclipse [Ubuntu] Paket javax.media.* nicht gefunden Allgemeine Java-Themen 7
J package javax.servlet does not exist Allgemeine Java-Themen 5
T Wo ist javax.swing.TransferHandler enthalten? Allgemeine Java-Themen 10
M System.setProperty("javax.net.ssl.trustStore", "mykey.pkx"); Allgemeine Java-Themen 1
G javax.jms.IllegalStateException: This method. Allgemeine Java-Themen 4
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
M Netbeans IDE und javax.comm 2.0 Allgemeine Java-Themen 4
O javax.comm ? Allgemeine Java-Themen 3
L Fehlende Teile des javax Packages Allgemeine Java-Themen 3
P welche java version für javax.mail? Allgemeine Java-Themen 7
L javax.comm unter Linux Allgemeine Java-Themen 11
G javax.comm bzw serielle Schhnittstelle? Allgemeine Java-Themen 2
S Fehler bei der javax.usb api Allgemeine Java-Themen 2
reibi javax.crypto.SecretKey - Einfaches Beispiel gewünscht ;-) Allgemeine Java-Themen 2
K javax.comm Problem beim starten aus .jar heraus Allgemeine Java-Themen 3
foobar Rxtx vs javax.comm Allgemeine Java-Themen 2
T Exception at javax.swing.plaf.basic.BasicTableUI.paintCell Allgemeine Java-Themen 3
T Wo kann ich Javax.Comm Api Downloaden ? Allgemeine Java-Themen 6
C [javax.mail] Betreff vergleichen Allgemeine Java-Themen 5
C [javax.mail] Folder not open Allgemeine Java-Themen 2
H javax.comm und Parallele Schnittstelle (PIN für PIN) Allgemeine Java-Themen 7
S Javax.comm Probleme mit Ansteuerung eines 8051 EEPROMs Allgemeine Java-Themen 8
F Problem beim Drucken mit javax.print Allgemeine Java-Themen 2
M javax.mail – Sending failed – Invalid Addresses Allgemeine Java-Themen 8
S RS232 mit javax.comm Allgemeine Java-Themen 5
N javax.security.sasl verzweifelt gesucht Allgemeine Java-Themen 2
P javax.sound: clip.stop(); Allgemeine Java-Themen 4
S javax.comm unter Windows XP Allgemeine Java-Themen 2
KonradN SonarLint: Resources should be closed bei Stream<T>? Allgemeine Java-Themen 6
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
looparda Stream mit Sonderbehandlung des ersten Elements Allgemeine Java-Themen 17
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
M stream.Collectors Fehlermeldung Allgemeine Java-Themen 1
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
G Neues Objekt aus List<JsonObject> mit Stream Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
N Java stream filtern. Allgemeine Java-Themen 19
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
N [stream-api] Parameter pro Typ zählen Allgemeine Java-Themen 1
J Stream-basierter Cache Allgemeine Java-Themen 4
D IP-Cam live stream speichern Allgemeine Java-Themen 9
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
D Klassen Zeit aus NMEA-Stream in SimpleDateFormat Allgemeine Java-Themen 17
J Stream-Murks! Allgemeine Java-Themen 18
T Problem mit gzip Stream und Ende der Datei Allgemeine Java-Themen 2
JAVATUX Java Programm mit ATI Stream Unterstützung Allgemeine Java-Themen 3
X Audio Internet-Stream Allgemeine Java-Themen 2
B Stream Verständnisproblem Allgemeine Java-Themen 2
P Mime Type aus Stream lesen Allgemeine Java-Themen 5
C Bit Stream Klasse Allgemeine Java-Themen 9
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
M PCL Stream lesen und schreiben Allgemeine Java-Themen 6
musiKk Stream zum Lesen von Dateien mit seek und peek Allgemeine Java-Themen 2
J Problem mit Scanner-Stream Allgemeine Java-Themen 2
O Stream unvollständig Allgemeine Java-Themen 3
0 Stream/Datei an VLC übergeben und abspielen Allgemeine Java-Themen 10
B getImage() vom Stream oder File Allgemeine Java-Themen 3
N Werte Von C++ nach Java über den Stream möglich? Allgemeine Java-Themen 8
S Stream ReadLine() Allgemeine Frage Allgemeine Java-Themen 5
S Stream ohne Referenz kopieren ? Allgemeine Java-Themen 4
D FileInputStream bzw. BufferedInput Stream Puffern Allgemeine Java-Themen 6
G Live-Stream einer WebCam importieren Allgemeine Java-Themen 3
T Mehrere Dateien byteweise durch stream schieben Allgemeine Java-Themen 9
T Stream encodierrn und decodieren mit JSpeex Allgemeine Java-Themen 2
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
O Input stream geht net Allgemeine Java-Themen 2
N Speichern von binären Dateien (Zip-Archiv) per Stream? Allgemeine Java-Themen 6
T Bit-Stream Allgemeine Java-Themen 12
R Stream für alle Dateiarten Allgemeine Java-Themen 9
thE_29 API für transport stream Allgemeine Java-Themen 2
M Output Stream / Protokoll does not support output Allgemeine Java-Themen 2
D GetResourceAsStream - Stream closed exception Allgemeine Java-Themen 5
G Umwandlung in Stream Allgemeine Java-Themen 5
J Output Stream Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben