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



## dvullriede (4. Jun 2009)

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:


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


----------



## faetzminator (6. Jun 2009)

du könntest die DTD herunterladen und lokal verlinken


----------



## dvullriede (8. Jun 2009)

faetzminator hat gesagt.:


> 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 (8. Jun 2009)

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 (9. Jun 2009)

Wildcard hat gesagt.:


> 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 (9. Jun 2009)

Dein Handler muss einfach die Methoden von EntityResolver überschreiben um zu verhindern das externe Entities aufgelöst werden.


----------



## dvullriede (9. Jun 2009)

Wildcard hat gesagt.:


> Dein Handler muss einfach die Methoden von EntityResolver überschreiben um zu verhindern das externe Entities aufgelöst werden.



Ah. Danke für den Hinweis. Werd mir die die Sache mit dem EntityResolver mal anschauen.


----------

