ubuntuusers.de

Einfacher XML Validator

Status: Ungelöst | Ubuntu-Version: Ubuntu 26.04 (Resolute Raccoon)
Antworten |

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 615

Wohnort: bochum, germany

Hallo Gemeinde, mal ein einfaches Java Programm, das prüft, ob eine XML Datei valide ist. Allerdings ohne Berücksichtigung eines Schemas.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.File;

import javax.swing.JFileChooser;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class Main {

	public static void main(String[] args)
	{
		try
		{
			JFileChooser chooser = new JFileChooser();
			int rc = chooser.showOpenDialog(null);
			if (rc == JFileChooser.APPROVE_OPTION)
			{
				File file = chooser.getSelectedFile();
				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
				DocumentBuilder db = dbf.newDocumentBuilder();
				org.w3c.dom.Document doc = db.parse(file.getAbsolutePath());
				System.out.println("XML Version: " + doc.getXmlVersion());
				
			}
			else
			{
				System.out.println("Main:main:abgebrochen");
			}
		}
		catch (Exception e)
		{
			System.out.println("Main:main:Exception:");
			System.out.println(e.toString());
		}
	}

}

Moderiert von schwarzheit:

Verschoben, da kein Problem besteht das gelöst werden soll.

schwarzheit Team-Icon

Supporter
Avatar von schwarzheit

Anmeldungsdatum:
31. Dezember 2007

Beiträge: 9222

Und was ist die Frage / das Problem?

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 615

Wohnort: bochum, germany

Sorry, kein Frage oder Problem, wollte einfach nur mal ein simples aber nützliches Programm vorstellen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17673

Wohnort: Berlin

Nun ja. Als Javacode muss die Klasse Main in einem File Main.java gespeichert sein, aus der durch Kompilation dann eine Main.class erzeugt wird.

Wenn Du jedes Projekt nach diesem Schema benennst, dass die Klasse, mit der Mainmethode auch Main genannt wird, dann hast Du nachher Hunderte Programme auf dem Rechner, die alle "Main" heißen. Ohne Packagedeklaration musst Du dann immer den Ordnerpfad in den Programmstart reinfummeln um zu sagen, welches Main du jetzt mainst, eh, meinst. ☺ Vorteil - Du musst Dir nie einen Programmnamen merken, aber teuer erkauft, weil der Pfadname gemerkt werden muss.

Langer Rede kurzer Sinn: Überleg' Dir einen passenden, guten Namen für Dein Programm. Er sollte kurz und sweet und 'to the point' sein. So nennst Du dann Deine Hauptklasse, also vielleicht XmlValidator oder XmlChecker. (Die Exceptionmeldungen sollten dann auch angepasst werden).

Dem Konstruktor "new JFileChooser();" kannst Du einen Parameter mitgeben, so dass das aktuelle Verzeichnis vorgeschlagen wird, um eine Datei zu öffnen. Das ist oft nützlicher, als das Homeverzeichnis zu verwenden. Es ist auch leichter vom aktuellen Verzeichnis zum Home zu wechseln als umgekehrt.

Außerdem könnte es nützlich sein, einen Dateinamensfilter vorzusehen, nämlich "*.xml", um die Auswahl einzuschränken, aber das Öffnen anderer Files dabei nicht zu verbauen, da ja viele Dateien im XML-Format Spezialisierungen sind, wie etwa svg-Dateien.

1
2
	System.out.println("Main:main:Exception:");
	System.out.println(e.toString());

Da in Java alle Objekte von Object abgeleitet sind, und daher die toString () - Methode erben oder überschreiben, hat man beschlossen, diese toString-Methode immer dann automatisch aufzurufen, wenn eine Stringverkettung der Form STRING + NichtString stattfindet. Das spart Zeit und Raum ein und versteht jeder, der etwas länger mit Java arbeitet.

1
	System.out.println ("XmlChecker.main: Exception:\n" + e);

homer65

(Themenstarter)
Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 615

Wohnort: bochum, germany

user_unknown schrieb:

Nun ja. Als Javacode muss die Klasse Main in einem File Main.java gespeichert sein, aus der durch Kompilation dann eine Main.class erzeugt wird.

Das war früher so, stimmt Heute mit aktuellen Java Versionen nicht mehr.

Wenn Du jedes Projekt nach diesem Schema benennst, dass die Klasse, mit der Mainmethode auch Main genannt wird, dann hast Du nachher Hunderte Programme auf dem Rechner, die alle "Main" heißen. Ohne Packagedeklaration musst Du dann immer den Ordnerpfad in den Programmstart reinfummeln um zu sagen, welches Main du jetzt mainst, eh, meinst. ☺ Vorteil - Du musst Dir nie einen Programmnamen merken, aber teuer erkauft, weil der Pfadname gemerkt werden muss.

Stimmt daher auch nicht.

Langer Rede kurzer Sinn: Überleg' Dir einen passenden, guten Namen für Dein Programm. Er sollte kurz und sweet und 'to the point' sein. So nennst Du dann Deine Hauptklasse, also vielleicht XmlValidator oder XmlChecker. (Die Exceptionmeldungen sollten dann auch angepasst werden).

Ok, könnte man drüber nachdenken, ist aber nicht verpflichtend.

Dem Konstruktor "new JFileChooser();" kannst Du einen Parameter mitgeben, so dass das aktuelle Verzeichnis vorgeschlagen wird, um eine Datei zu öffnen. Das ist oft nützlicher, als das Homeverzeichnis zu verwenden. Es ist auch leichter vom aktuellen Verzeichnis zum Home zu wechseln als umgekehrt.

Danke für den Hinweis

Außerdem könnte es nützlich sein, einen Dateinamensfilter vorzusehen, nämlich "*.xml", um die Auswahl einzuschränken, aber das Öffnen anderer Files dabei nicht zu verbauen, da ja viele Dateien im XML-Format Spezialisierungen sind, wie etwa svg-Dateien.

Ebenfalls Danke.

1
2
	System.out.println("Main:main:Exception:");
	System.out.println(e.toString());

Da in Java alle Objekte von Object abgeleitet sind, und daher die toString () - Methode erben oder überschreiben, hat man beschlossen, diese toString-Methode immer dann automatisch aufzurufen, wenn eine Stringverkettung der Form STRING + NichtString stattfindet. Das spart Zeit und Raum ein und versteht jeder, der etwas länger mit Java arbeitet.

1
	System.out.println ("XmlChecker.main: Exception:\n" + e);

Nöh, da kommt eine andere Ausgabe als gewollt

Liebe Grüße Christian

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17673

Wohnort: Berlin

1
2
	System.out.println("Main:main:Exception:");
	System.out.println(e.toString());

Da in Java alle Objekte von Object abgeleitet sind, und daher die toString () - Methode erben oder überschreiben, hat man beschlossen, diese toString-Methode immer dann automatisch aufzurufen, wenn eine Stringverkettung der Form STRING + NichtString stattfindet. Das spart Zeit und Raum ein und versteht jeder, der etwas länger mit Java arbeitet.

1
	System.out.println ("XmlChecker.main: Exception:\n" + e);

Nöh, da kommt eine andere Ausgabe als gewollt

Test mit einem File, der wenig mit XML gemein hat:

1
2
[Fatal Error] xorunique.sh:1:1: Content ist nicht zulässig in Prolog.
main:Exception: org.xml.sax.SAXParseException; systemId: file:///home/stefan/proj/mini/forum/xorunique.sh; lineNumber: 1; columnNumber: 1; Content ist nicht zulässig in Prolog.

Test mit einem SVG-File, der so rumliegt:

1
2
[Fatal Error] :4:28: JAXP00010003: Die Länge von Entity "%SVG.Presentation.attrib" ist "15.002" und überschreitet den Grenzwert "15.000", der von "jdk.xml.maxParameterEntitySizeLimit" festgelegt wurde.
main:Exception: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 28; JAXP00010003: Die Länge von Entity "%SVG.Presentation.attrib" ist "15.002" und überschreitet den Grenzwert "15.000", der von "jdk.xml.maxParameterEntitySizeLimit" festgelegt wurde.

Mit einem fast richtigen XML-File:

1
2
3
java XmlChecker 
[Fatal Error] sample.xml:1:15: Der Wert nach "version" in der XML-Deklaration muss eine Zeichenfolge in Anführungszeichen sein.
main:Exception: org.xml.sax.SAXParseException; systemId: file:///home/stefan/proj/mini/forum/sample.xml; lineNumber: 1; columnNumber: 15; Der Wert nach "version" in der XML-Deklaration muss eine Zeichenfolge in Anführungszeichen sein.

Und noch einer

1
2
3
java XmlChecker 
[Fatal Error] demo.xml:50:1: XML-Dokumentstrukturen müssen innerhalb derselben Entity beginnen und enden.
main:Exception: org.xml.sax.SAXParseException; systemId: file:///home/stefan/proj/mini/forum/demo.xml; lineNumber: 50; columnNumber: 1; XML-Dokumentstrukturen müssen innerhalb derselben Entity beginnen und enden.

Und mit einem funktionierenden:

1
XML Version: 1.0

Was kommt denn bei Dir raus, und was wäre stattdessen gewollt?

homer65 schrieb:

user_unknown schrieb:

Nun ja. Als Javacode muss die Klasse Main in einem File Main.java gespeichert sein, aus der durch Kompilation dann eine Main.class erzeugt wird.

Das war früher so, stimmt Heute mit aktuellen Java Versionen nicht mehr.

Ja, viel Spaß beim Suchen nach dem Quellcodefile für Main. Das muss zwar seit Version 25 nicht mehr so sein, aber Main ist ja per se ein schlechter Name für ein Javaprogramm, weil er total unspezifisch ist. Ja, es gab noch nie die Pflicht oder auch nur Konvention, die Klasse mit der Mainmethode "Main" zu nennen. Dass die Klasse nicht so heißen muss wie die Datei bedeutet aber, es ist heute noch WENIGER geboten, eine Klasse "Main" zu nennen.

Wenn Du jedes Projekt nach diesem Schema benennst, dass die Klasse, mit der Mainmethode auch Main genannt wird, dann hast Du nachher Hunderte Programme auf dem Rechner, die alle "Main" heißen. Ohne Packagedeklaration musst Du dann immer den Ordnerpfad in den Programmstart reinfummeln um zu sagen, welches Main du jetzt mainst, eh, meinst. ☺ Vorteil - Du musst Dir nie einen Programmnamen merken, aber teuer erkauft, weil der Pfadname gemerkt werden muss.

Stimmt daher auch nicht.

Stimmt wohl. Wenn Du einen Ordner mit zig kleinen Programmen hast, alle in Java geschrieben, alle mit einer Mainmethode, dann ist es nicht möglich mehr als eines davon "Main.java" zu nennen. Du kannst die Files zwar unterschiedlich benennen, aber wenn mehrere eine Klasse "Main" haben, dann wird der jüngste class-File den letzten überschreiben.

Langer Rede kurzer Sinn: Überleg' Dir einen passenden, guten Namen für Dein Programm. Er sollte kurz und sweet und 'to the point' sein. So nennst Du dann Deine Hauptklasse, also vielleicht XmlValidator oder XmlChecker. (Die Exceptionmeldungen sollten dann auch angepasst werden).

Ok, könnte man drüber nachdenken, ist aber nicht verpflichtend.

Nein, verpflichtend ist es nicht.

Antworten |