Das Programm hängt etwa 5 Sekunden beim Aufruf der parse-Methode

Status
Nicht offen für weitere Antworten.

dvullriede

Mitglied
Wie bereits im Titel geschrieben hängt das Programm mehrere Sekunden sobald es die parse-Methode erreicht hat(hab das im Debug getestet). Das Seltsame ist, das die Anwendung(ist wesentlich grösser aber hier nur nen kleines selbstkompilierendes Beispiel) auf dem Rechner in der Schule wunderbar läuft und es eben nicht zu diesem Hänger kommt.
Deswegen vermute ich weniger das es ein Programmierproblem ist. Andererseits kann ich mir aber auch nicht vorstellen in wieweit es ein externes Problem sein könnte.

Falls es gegebenfalls ein Computer/Betriebssystem-Problem sein könnte hier die wichtigsten Daten:

Windows Vista
Quad Core Intel Prozessor(2.4 GHz/Kern)
4 GB Speicher

Einmal hier das Programm bei dem das Problem auftritt:

Code:
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Parser
{
	public static void main(String[] args)
	{
		new Parser();
	}
	public Parser()
	{
		try 
		{
			SAXParserFactory factory = SAXParserFactory.newInstance(); 
			javax.xml.parsers.SAXParser parser = null;
			try 
			{
				parser = factory.newSAXParser();
			}
			catch (ParserConfigurationException e1) 
			{
				e1.printStackTrace();
			}
			try
			{	
				parser.parse(new File("d:\\html\\index.html"),new WWWHandler()); //an dieser Stelle hängt er dann einige Sekunden
			} catch (IOException e) 
			{
				e.printStackTrace();
			}
		}
		catch (SAXException e) 
		{
			e.printStackTrace();
		}
	}
	public class WWWHandler extends DefaultHandler
	{
	}
}

Und hier die wirklich kleine Beispiel XML-Datei:

[XML]
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" >
<head>
<title> </title>
</head>
<body>
</body>
</html>

[/XML]

Hoffe Ihr könnt mir mit dem Problem helfen :)

Nachtrag: Ich habe mittlerweile den Flaschenhals gefunden. Beim Parsen der Seite läd er etliche Dateien runter(xhtml1-strict.dtd, xhtml-lat1.ent, xhtml-special.ent, xhtml-special.ent, xhtml-symbol.ent). Mir ist allerdings immer noch schleierhaft warum er für die 50kb 5 Sekunden braucht. Nichtsdestotrotz möchte ich weiterhin die html datei verlinken lassen auf die online verfügbaren dateien er soll aber falls diese lokal verfügbar sind diese benutzen. Wie bekomme ich sowas hin?
 
Zuletzt bearbeitet:

dvullriede

Mitglied
du könntest die DTD herunterladen und lokal verlinken

Danke für den Hinweis. Habe das zu Testzwecken bereits gemacht(sonst hätte ich wohl nicht den Geschwindigkeitsunterschied bemerkt =P). Leider ändert das aber nichts an der Tatsache, das die Anwendung nen XHTML-Browser wird(Die Websiten werden ganz normal online abrufen).
Könnte natürlich die Datei runterladen dann nach der URL parsen, schauen ob es ne dtd ist, die ich lokal hab danach die heruntergeladene Datei entsprechend verändern damit Sie auf die lokalen Dateien verlinkt und dann erst durch nen Parser jagen. Aber dachte da gäb es vielleicht noch ne sinnvolle Alternative. ^^
 

Wildcard

Top Contributor
Warum willst du überhaupt gegen eine DTD/XSD validieren für einen Browser?
Der soll es doch nur anzeigen und nicht strukturell überprüfen, oder?
 

dvullriede

Mitglied
Warum willst du überhaupt gegen eine DTD/XSD validieren für einen Browser?
Der soll es doch nur anzeigen und nicht strukturell überprüfen, oder?

Hmm. An sich könnte ich wohl darauf verzichten. So wie es allerdings aussieht, hat er eh nie versucht zu validieren, weil laut der SAX-API die setValidating(boolean) bei Objekten der SAXParserFactory-Klasse standardmässig auf false steht. Auch ein explizites Setzen auf false hat nicht zu einer Beschleunigung geführt. Er scheint also immer noch so, als ob er die dtd obwohl er sie nicht zum Validieren braucht herunterzulädt. Gibt es da vielleicht ne Möglichkeit ihm zu sagen das er die

[XML]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
[/XML]

einfach ignorieren soll(zumindest die Addresse wo die dtd verfügbar ist :))?
 

Wildcard

Top Contributor
Dein Handler muss einfach die Methoden von EntityResolver überschreiben um zu verhindern das externe Entities aufgelöst werden.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben