2016-07-20 8 views
0

Ich habe eine XML-Datei in meinem Ressourcen-Ordner. Dies ist, was ich habe versucht:DocumentBuilder gibt java.net.MalformedURLException: no!/In spec

zuerst die Datei aus dem Ordner Ressourcen erhalten:

ClassLoader classLoader = ParseXML.class.getClassLoader(); 
File file = new File(classLoader.getResource("sample.xml").getFile()); 

dann die DOM Parse verwenden, um die Datei zu lesen:

DocumentBuilder dBuilder = null; 
    Document doc =null;    
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    dBuilder = dbFactory.newDocumentBuilder(); 
    doc = dBuilder.parse(file) 

    doc.getDocumentElement().normalize(); 
    System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); 

Es hält mich geben " java.net.MalformedURLException: no!/in spec ". Was mache ich falsch?

Ich habe auch versucht, dies zu tun:

fileAsString = IOUtils.toString(classLoader.getResourceAsStream("sample.xml")); 
doc = dBuilder.parse(new InputSource(new ByteArrayInputStream(fileAsString.getBytes("utf-8")))); 

aber Fehler bleibt gleich. Jede Hilfe wird geschätzt. Danke.

Wie gewünscht, einschließlich der Stack-Trace:

java.net.MalformedURLException: no !/ in spec 
    at java.net.URL.<init>(Unknown Source) 
    at java.net.URL.<init>(Unknown Source) 
    at java.net.URL.<init>(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) 
    at com.northwestern.XMLParse.ParseXML.main(ParseXML.java:47) 
Caused by: java.lang.NullPointerException: no !/ in spec 
    at sun.net.www.protocol.jar.Handler.parseAbsoluteSpec(Unknown Source) 
    at sun.net.www.protocol.jar.Handler.parseURL(Unknown Source) 
    ... 18 more 
+1

Konto Bitte geben Sie die gesamte Stack-Trace der Ausnahme in Ihre Frage. – VGR

+0

@VGR Ich habe jetzt die Stack-Trace enthalten. Vielen Dank. – user3044240

+1

Dieser Stack-Trace schlägt vor, dass Ihre Datei 'sample.xml' auf eine ungültige URL in der DTD verweist. Können Sie den DTD-Teil des XML-Codes auch in Ihre Frage einfügen? – VGR

Antwort

0

Von Ihrem Kommentar, enthält die XML-Datei die folgende Zeile:

<!DOCTYPE Policies PUBLIC "-//OpenSSO Policy Administration DTD//EN" "jar://com/sun/identity/policy/policyAdmin.dtd"> 

Das tritt Ausnahme, weil ein Glas: URL immer die Form nimmt jar:jar-url!/jar-entry-pfad, daher ist "jar: //com/sun/identity/policy/policyAdmin.dtd" keine gültige URL. Ein Beispiel für eine gültige URL wäre: jar: http://www.example.com/lib/dtds.jar!/com/sun/identity/policy/policyAdmin.dtd

Natürlich wäre die ideale Lösung, um die XML-Datei zu reparieren, oder sagen Sie ihren Autoren, um es zu beheben. Aber es klingt, als hättest du diese Option nicht.

Als Erstes würde ich versuchen, die Dereferenzierung der System-ID durch Hinzufügen von dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); zu Ihrem Code zu verhindern, bevor Sie einen DocumentBuilder erstellen. Aber wie Ihr Kommentar sagt, scheint das nicht zu funktionieren.

Das nächste, was ich versuchen würde, ist dbFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");, obwohl ich vermute, die Implementierung wird versuchen, die System-ID des DOCTYPE in eine URL unabhängig zu konvertieren, was bedeutet, SetAttribute wird auch nicht helfen.

Es ist möglich, dass dies der fehlgeleitete Versuch eines Benutzers war, eine Klassenpfadressource als URL anzugeben (was nicht ohne Kenntnis des Speicherorts der enthaltenen JAR-Datei möglich ist). Sie können möglicherweise ihren Fehler durch Setzen eines EntityResolver:

dBuilder.setEntityResolver(new EntityResolver() { 
    @Override 
    public InputSource resolveEntity(String publicID, 
            String systemID) 
    throws SAXException, 
      IOException { 

     if (systemID.startsWith("jar:") && !systemID.contains("!/")) { 
      String path = systemID.replaceFirst("^jar:/*", "/"); 
      return new InputSource(ParseXML.class.getResourceAsStream(path)); 
     } 
     return null; 
    } 
}); 
+0

Ich konnte es durch Hinzufügen von dbFactory.setFeature ("http://apache.org/xml/features/nonvalidating/load-external-ddt", false); .... Danke für die Antwort. – user3044240