# Beim Parsen einer XML-Datei Connection timed out



## Katse (13. Dez 2012)

Hallo,

ich möchte XML-Dateien auslesen, aber beim Parsen hat er Probleme und ich bekomme eine IOException: Connection timed out: connect

Die xml-Datei ist folgendermaßen aufgebaut:[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module [
<!ENTITY % ISOEntities PUBLIC "ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML" "http://www.s1000d.org/S1000D_2-3/ent/xml/ISOEntities">
%ISOEntities;
]>
<module>.....</module>
[/XML]

Wenn ich <!ENTITY % ISOEntities PUBLIC "ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML" "http://www.s1000d.org/S1000D_2-3/ent/xml/ISOEntities">
%ISOEntities; rauslösche, dann kann er die Datei parsen, aber ich möchte dies nicht in allen Dateien mit suchen-ersetzen herauslöschen.

Meine Funktion zum Parsen der XML-Datei sieht folgendermaßen aus:

```
public Document getDocument(String file) {
    Document doc=null;
    try {
      File in = new File(file);
      DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
      dfactory.setIgnoringElementContentWhitespace(true);
      dfactory.setExpandEntityReferences(false);
      dfactory.setIgnoringComments(true);
      doc = dfactory.newDocumentBuilder().parse(in);
      doc.getDocumentElement().normalize();
    }catch(FileNotFoundException fe) {
      System.out.println("File nicht gefunden: "+file+";"+fe.getMessage());
    }catch(ParserConfigurationException pe) {
      System.out.println("Fehler beim Parsen: "+pe.getMessage());
    }catch(SAXException se) {
      System.out.println("SAXException: "+se.getMessage());
    }catch(IOException ie) {
      System.out.println("IOException: "+ie.getMessage());
    }    
    return doc;
  }
```

Gibt es keine Angabe, dass er die Entity ignoriert oder was mache ich falsch? Ich hoffe es hat jemand einen Tipp für mich. Google hat mir leider nicht weiterhelfen können ;(
Viele Grüße


----------



## Katse (13. Dez 2012)

So funktioniert es jetzt:

```
public Document getDocument(String file) {
    Document doc=null;
    try {
      File in = new File(file);
      DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = dfactory.newDocumentBuilder();
      dfactory.setIgnoringElementContentWhitespace(true);
      dfactory.setExpandEntityReferences(false);
      dfactory.setIgnoringComments(true);
      dfactory.setValidating(false);
      builder.setEntityResolver(new EntityResolver() {
            public InputSource resolveEntity(String publicId, String systemId) {
                return new InputSource(new StringReader(""));
            }
            });
      doc = builder.parse(in);
      doc.getDocumentElement().normalize();
    }catch(FileNotFoundException fe) {
      System.out.println("File nicht gefunden: "+file+";"+fe.getMessage());
    }catch(ParserConfigurationException pe) {
      System.out.println("Fehler beim Parsen: "+pe.getMessage());
    }catch(SAXException se) {
      System.out.println("SAXException: "+se.getMessage());
    }catch(IOException ie) {
      System.out.println("IOException: "+ie.getMessage());
    }    
    return doc;
  }
```

Allerdings tritt bei Dateien, bei denen ndash verwendet wird, folgender Fehler auf (zB : Test 1 &ndash; Master)
 The entity "ndash" was referenced, but not declared.
SAXException: The entity "ndash" was referenced, but not declared.

Wie könnte man diesen Fehler abfangen?
Viele Grüße


----------



## Katse (17. Dez 2012)

Irgendwie erkennt er jetzt keine Entities mehr, die verwendet werden, wie:
&ndash;
&uuml;
&auml;
&ouml;
&plusmn;
&deg;
&mdash;

Hat keiner einen Tipp für mich? ???:L
Viele Grüße


----------



## Ullenboom (17. Dez 2012)

Der XML-Parser versucht Verbindung zum Server aufzubauen, dessen URL du angibst. Lösung:
a) Das Java-Programm kann nicht direkt ins Netz, weil etwa ein Proxy dazwischen hängt. Hier ansetzen.
b) Einen eigenen SAX-Entity-Resolver schreiben.


----------



## Katse (17. Dez 2012)

Hallo 

Jetzt hab ichs gecheckt, habe das Programm jetzt noch so geändert:


```
builder.setEntityResolver(new EntityResolver() {
            public InputSource resolveEntity(String publicId, String systemId) {
			  if(systemId.equals("http://www.s1000d.org/S1000D_2-3/ent/xml/ISOEntities")){
                return new InputSource("C:\\Java\\classes\\dtd\\ISOEntities.dtd");
			  }else{
			    return null;
			  }
            }
            });
```

und jetzt funktionierts 

Vielen lieben Dank @Ullenboom :applaus:
Viele Grüße


----------

