XML-Datei einlesen bei fehlender dtd, java

Hallo zusammen,

Nachdem mir bei meinem letzten Problem so schnell und kompetent geholfen wurde, versuche ich es jetzt nochmal.

Ich arbeite an einem Java-Programm, das XML-Dateien einliest und daraufhin verschiedene Prüfungen durchführt. Das Programm läuft und funktioniert.
Allerdings kann es vorkommen, dass eine XML-Datei einen Doctype-Verweis (dtd) enthält, der einen Internetlink beinhaltet. Wird das Programm dann ausgeführt, ohne dass eine Internetverbindung besteht, „meckert“ der XML-Parser verständlicherweise, dass die dtd-Datei nicht gefunden wird. Bisher kein Problem. In der neuen Programmversion soll dieses „Meckern“ aber abgestellt werden können, sodass die XML-Datei dennoch eingelesen wird und den Prüfungen unterzogen werden kann.
Leider habe ich die dazu nötigen Einstellungen bisher nicht finden können. Derzeit wird die XML-Datei (bzw. entsprechend gegebener XPath-Ausdrücke bestimmte Knoten daraus) über folgenden Code eingelesen:

// XPath-Expression compilieren
synchronized (xPath) {
xPathExpression = xPath.compile(xPathString);
}

// XPath-Ausdruck auf InputSource anwenden
return (NodeList)xPathExpression.evaluate(inputSource, XPathConstants.NODESET);

xPath ist dabei ein javax.xml.xpath.XPath und xPathExpression eine javax.xml.xpath.XPathExpression. Könnt Ihr mir da weiterhelfen? Ich kann auch andere XML-Parser (JDOM, dom4j) nutzen, das lässt sich ja schnell umbauen. Wenn Ihr also „nur“ für einen anderen Parser eine Lösung kennt, bitte her damit…:wink:

Ich hoffe, ich habe das Problem klar genug beschrieben und danke schonmal,

Mfg Martin

Hallo Martin,

hier kann ich leider nicht „so schnell“ helfen, da ich xmlbeans von Apache zum Einlesen verwende und ausschließlich mit xml-Dateien arbeite, für die ich ein XML-Schema (xsd) besitzte oder dieses schrittweise aufbaue, je nachdem, was ich von der xml-Datei lesen will.

Aber vielleicht ist deine Frage auch unabhängig von XML als Java-Frage zu deuten:
Wie äußert sich den das „Meckern“?
Kann man das nicht mit einer Exception abfangen und dann weitermachen?

Wirst sicher aus anderer Quelle eine noch hilfreichere Antwort erhalten.

Gruß

Rolf

Hallo Rolf,

Danke für die Antwort. Die Exception lässt sich schon abfangen, aber gelesen wird die XML-Datei dadurch nicht. Sprich, ich kann die Exception erst abfangen, wenn Sie vom Parser geworfen wird und dann ist es schon „zu spät“. Wenn man Sie im Parser abfangen könnte, dann könnte man dem Parser eventuell „befehlen“ trotzdem weiter zu machen. Aber die einzige Möglichkeit, die ich dafür sehe, ist, einen eigenen Parser zu schreiben. Deswegen hatte ich gehofft, dass es eine mehr oder weniger simple Einstellung dafür gibt.

Derzeit habe ich mir damit beholfen, die InputSource bei fehlender DTD nicht mit der Originaldatei zu befüllen, sondern mit einem StringReader. Dem übergebe ich die Original-Datei als String, wobei ich die Doctype-Declaration entferne.

Mfg Martin

Hallo Rolf,
Bevor Du weiter nachdenkst: Ich habe die/eine Lösung gefunden.
Folgende Zeilen lösen das Problem:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setValidating(false);
documentBuilderFactory.setFeature(„http://apache.org/xml/features/nonvalidating/load-ex…“, false);
Object documentBuilder = documentBuilderFactory.newDocumentBuilder();
Object localObject2 = ((DocumentBuilder)documentBuilder).parse(inputSource);
return (NodeList)xPathExpression.evaluate(localObject2, XPathConstants.NODESET);

Dennoch vielen Dank,
Mfg Martin

Sorry,

kenne mich damit nicht wirklich aus