[Fatal Error] org.xml.sax.SAXParseException

izoards

Bekanntes Mitglied
Hallo miteinander,


Beim auslesen meines XML Files, kriege ich ab und zu (eben nicht immer!) folgende Fehlermeldung:

Java:
[Fatal Error] path.xml:1:1: Vorzeitiges Dateiende.
org.xml.sax.SAXParseException; systemId: file:/C:/intellij/FlowSys/Projects/DocToPDF/target/path.xml; lineNumber: 1; columnNumber: 1; Vorzeitiges Dateiende.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at FlowSys.XML_Parser.getPath(XML_Parser.java:29)
    at FlowSys.RunnerService$1.call(RunnerService.java:41)
    at FlowSys.RunnerService$1.call(RunnerService.java:26)
    at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at javafx.concurrent.Service.lambda$null$6(Service.java:725)
    at java.security.AccessController.doPrivileged(Native Method)
    at javafx.concurrent.Service.lambda$executeTask$7(Service.java:724)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)


Das XML sieht meiner Meinung nach immer gut aus, der Code wird auch weiter ausgeführt, und das Programm läuft auch weiter wie es soll...

Java:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><FlowSys>
    <PATH Customer="1" Mail="true" PDFName="1" PDM="true" PathToDataFile="C:\DataFile" PathToWinFTMExport="C:\DocToPDF\Input" pathArchiv="C:\DocToPDF\Archiv">
    </PATH>
</FlowSys>


Hier in Zeile 18 tritt anscheinend ab und zu ein Problem auf:

Java:
@Override
    protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override
            protected Void call() throws Exception {

                System.out.println("Background task started...");
                XML_Parser xmlParser = new XML_Parser();


                //Pfad des Jar's herausfinden:
                File path = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
                String pathToSettings = path.getParentFile() + "\\path.xml";


                //vor dem starten Pfade auslesen!
                String pathArchiv = xmlParser.getPath("PATH", "pathArchiv", pathToSettings);
                pathToDataFile = xmlParser.getPath("PATH", "PathToDataFile", pathToSettings);
                String pathWinFTMExport = xmlParser.getPath("PATH", "PathToWinFTMExport", pathToSettings);

                String pathOut = path.getParentFile().toString();

                controller.setFieldIn(pathArchiv);
                controller.setFieldDataFile(pathToDataFile);
                controller.setFieldExport(pathWinFTMExport);

                String mailStateFromXML = xmlParser.getPath("PATH", "Mail", pathToSettings);
                String PDMStateFromXML = xmlParser.getPath("PATH", "PDM", pathToSettings);

                String PDFName = xmlParser.getPath("PATH", "PDFName", pathToSettings);
                String customerField = xmlParser.getPath("PATH", "Customer", pathToSettings);
                System.out.println("PDFName: " + PDFName);

                Boolean mailState = Boolean.parseBoolean(mailStateFromXML);
                Boolean PDMState = Boolean.parseBoolean(PDMStateFromXML);
                controller.setMailStatus(mailState);
                controller.setPDMStatus(PDMState);



                DocToPDF runnerApp = new DocToPDF(pathArchiv, pathOut, pathWinFTMExport, mailState, PDMState, PDFName, customerField);
                runnerApp.start(controller);


                return null;
            }
        };


Und hier die Methode wo das XML ausgelesen wird:

Java:
 public String getPath(String TagName, String ElementName, String path) {

        String result = "";
        try {
            File inputFile = new File(path);
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(inputFile);
            doc.getDocumentElement().normalize();
            //System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

            NodeList nList = doc.getElementsByTagName(TagName);
            //System.out.println("----------------------------");

            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
         //       System.out.println("\nCurrent Element :" + nNode.getNodeName());

                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;

                    result = eElement.getAttribute(ElementName);
      //              System.out.println("result : " + result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
    
        }
        return result;
    }


Kann mir jemand helfen?

Herzlichen Dank....
 

izoards

Bekanntes Mitglied
Also inputFile sollte das xml file sein, welches path.xml heisst und der String (path) ist der Pfad inkl. name der path.xml datei.
Und im xml selbst, finde ich kein Problem...

Also bis jetzt hat's ja geklappt, bzw. evt. ist mir das Problem nicht aufgefallen. Habe neuerlich jedoch noch zwei JFX Combobox eingebaut.
Die gewähltenFelder werden ebenfalls ins XML geschrieben und auch wieder ausgelesen beim Neustart des Programms auf die gespeicherten Werte gesetzt.

Könnte das Problem daran liegen?
 
K

kneitzel

Gast
Schau Dir die Datei, die nicht gelesen werden konnte, doch einfach genau an. (Mit einem Editor, der auch Encoding anzeigen kann und so. Also unter Windows z.B. Notepad++)

Wobei line 1 column 1 danach klingt, dass Du ggf. ein Problem mit dem Encoding hast. Ggf. schreibst Du utf16 und liest eben nicht in UTF16 oder so. Das würde dann bedeuten, dass die Datei mit 0x00 startet und das dann kein gültiges Zeichen wäre.

Oder ein UTF BOM wurde geschrieben (Wobei Java UTF BOM nicht wirklich unterstützt, daher wird das eher nicht der Fall gewesen sein wenn die Datei mit Java erstellt wurde).

Das wären so Dinge, die mir gerade durch den Kopf gehen.
 

izoards

Bekanntes Mitglied
Ich kann im Notepad++ nichts sehen, dass irgendwo ein falsches Zeichen wäre...

Das XML File habe ich von Hand, ich glaube, im Wordpad geschrieben...
Wie kann ich prüfen, ob ich UTF8 lese und schreibe?
Anbei noch mein XML File...


Noch kurz zum Verständnis. Die DropDowns, (JavaFX ComboBox) werden im MainWindowController ausgelesen und auch dort ins XML-File geschrieben. Jedesmal, wenn dort etwas verändert wird, stoppe ich den Hintergrundtask und starte Ihn neu.
Beim starten des Hintergrundtasks, wird dann das XML file ausgelesen. Die Infos werden über die Methode an den Hintergrund als Strings übergeben.
Damit die Anzeige am GUI stimmt, werden die vom XML ausgelesenen Werte dann über Platform run later, vom MainWindowController gesetzt.

Ist diese Vorgehensweise prinzipiell richtig?
 

Anhänge

  • path.zip
    325 Bytes · Aufrufe: 0
K

kneitzel

Gast
Ist das die XML Datei, die Du geschrieben hast?

Ich bin immer noch etwas verwirrt - denn du schreibst ja an einer Stelle, dass Du in das XML Dinge rein schreibst.
Der Ablauf, den ich verstanden habe, ist also etwas wie:
- Du startest die Applikation, diese XML wird geladen
- Dann machst Du etwas und speicherst etwas in der XML Datei
- Danach ist die XML Datei nicht mehr lesbar

Oder wird die Datei generell nicht gelesen?
Das XML sieht korrekt aus und ist UTF-8 codiert. Das kannst Du in Notepad++ sehen, wenn Du dort in das Menü Kodierung schaust.
 

izoards

Bekanntes Mitglied
Genau, das ist die XML, die ich geschrieben habe. Also das Grundraster.
Übers Programm werden dann einfach die neuen Werte hineingeschrieben, also z.B. PathToDataFile = "C:\neuerPfad"

Das schreiben und lesen dieser Werte funktioniert eigentlich meistens. Jedoch eben, ab und zu kommt dieser Fehler.
Wann genau die XML nicht mehr gelesen werden kann, kann ich eben nicht sagen. Es passiert beim Starten des Programmes, aber eben, nur ab und zu...

Ich habe das Gefühl, dass das Problem mit den ComboBox Elementen zu tun haben könnte. Könnte das sein?
Hier lese ich ja die Position der ComboBox als int aus und speichere es als String ab. Beim auslesen dann wieder umgekehrt, das sollte jedoch zu keinen Problemen führen, oder?

Gibt es eigentlich ein Problem, wenn der Hintergrund Task gestoppt und wieder neu gestartet wird? (also mit cancel(), reset(), start())
 
K

kneitzel

Gast
Dann versuch mal, uns eine XML Datei zu geben, die nicht funktioniert. Da kann man dann auch mal rein schauen um zu sehen, was da dann falsch ist.

Ich habe das Gefühl, dass das Problem mit den ComboBox Elementen zu tun haben könnte. Könnte das sein?
Hier lese ich ja die Position der ComboBox als int aus und speichere es als String ab. Beim auslesen dann wieder umgekehrt, das sollte jedoch zu keinen Problemen führen, oder?
Sowas ist prinzipiell alles denkbar. Aber dann wäre die Fehlermeldung anders. Wenn eine Zahl nicht gelesen werden kann, dann hat man oft eine NumberFormatException oder so. Die Fehlermeldung selbst besagt ja, dass die XML Datei nicht lesbar ist, weil in Zeile 1 Zeichen 1 kein gültiges XML ist.

Gibt es eigentlich ein Problem, wenn der Hintergrund Task gestoppt und wieder neu gestartet wird? (also mit cancel(), reset(), start())
Wenn Du das sauber abgebildet hast, dann sollte es keine Probleme geben. Bei sowas ist aber halt immer darauf zu achten, dass Du z.B. Dateien richtig schließt und so. Aber auch da würde ich dann eher eine IOException erwarten, da eine Datei nicht geöffnet werden kann.

Somit passt sowas weniger zu dem Fehlerbild des Fehlers, den Du uns gezeigt hast.
 

izoards

Bekanntes Mitglied
Dann versuch mal, uns eine XML Datei zu geben, die nicht funktioniert. Da kann man dann auch mal rein schauen um zu sehen, was da dann falsch ist.
Werde die XML Datei im Falle eines Fehlers, mal rauskopieren und gerne hier reinstellen.
Komisch ist, dass ich gar nichts an der XML Datei ändere und es beim nächsten Mal kein Fehler gibt...

Werde heute Abend nochmals rangehen.
 

izoards

Bekanntes Mitglied
So, ich vermute, ich habe das Problem und zwar startet mein Background Task seit der implementierung der ComboBox zweimal(!?)
Somit könnte es ja vorkommen, dass das XML File gleichzeitig gelesen wird, richtig?

Meine Vermutung ist, dass ich beim setzen der ComboBox, welche ich ja nur so setzen möchte, wie diese mal vom Benutzer gesetzt wurde. Die Methode "on Action" der ComboBox selbst aufgerufen wird. Das möchte ich jedoch nicht!

Ich setze den Wert der Combo Box wie folgt. (über Platform run later aus dem Background Task)

Java:
 @FXML
    public void setChoosedDropDown(String PDFName, String customerField) {
        PDFDropDown.getSelectionModel().select(Integer.parseInt(PDFName));
        customerFieldDropDown.getSelectionModel().select(Integer.parseInt(customerField));
    }

Irgendwie wird dann aus dieser Methode ebenfalls die onAction Methoden der beiden ComboBox's aufgerufen!

Ist das Normal? Wie kann ich das verhindern?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
M error: package javafx.scene.web is not visible import javafx.scene.web.*; AWT, Swing, JavaFX & SWT 16
J SWT SWT Error: No more handles AWT, Swing, JavaFX & SWT 3
zhermann JavaFX DialogPane.showAndWait wirft Cast Error AWT, Swing, JavaFX & SWT 1
S JDBC Error "Too many Connections" AWT, Swing, JavaFX & SWT 11
I Fataler Error bei GUI-Ausführung AWT, Swing, JavaFX & SWT 3
E Swing Error icon in der TextArea AWT, Swing, JavaFX & SWT 1
U JavaFX Error: Handler Method not found AWT, Swing, JavaFX & SWT 3
N css und JavaFX error parse AWT, Swing, JavaFX & SWT 6
D JavaFX build.fxbuild error beim Erstellen einer exe AWT, Swing, JavaFX & SWT 2
L Rekursive Methoden -> Error: StackOverFlow AWT, Swing, JavaFX & SWT 2
A JavaFX Webapp Runtime error AWT, Swing, JavaFX & SWT 10
X JavaFX TableView Error beim clicken des außenbereiches AWT, Swing, JavaFX & SWT 5
A Swing Zahlenraten GUI wirft nur die Error Message aus AWT, Swing, JavaFX & SWT 6
A Java Swing Error AWT, Swing, JavaFX & SWT 3
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
E Laden von Bilddateien erzeugt OutOfMemory Error AWT, Swing, JavaFX & SWT 6
M JTree => Event Dispatching Error AWT, Swing, JavaFX & SWT 2
C SWT Error/Warnings in TreeView AWT, Swing, JavaFX & SWT 2
F Java heap space error trotz -Xmx512m AWT, Swing, JavaFX & SWT 9
G wirklich großer Text in JTextArea => Heap Space Error AWT, Swing, JavaFX & SWT 5
G Uncaught error fetching image + Ich checks nicht^^ AWT, Swing, JavaFX & SWT 6
V Lock & Feel für Error-Messages AWT, Swing, JavaFX & SWT 6
A error fetching image AWT, Swing, JavaFX & SWT 5
M Uncaught error fetching image AWT, Swing, JavaFX & SWT 2
N JList getSelectedIndex-Error AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben