2017-03-07 2 views
0

Ich habe den folgenden Code-Schnipsel:Warum wirft dieser Code eine MalformedURLException?

public class DOMTest { 

    public static void main(String[] args) 
      throws ParserConfigurationException, SAXException, IOException { 
     String xml = "<D:propfind xmlns:D=\"DAV:\"" 
       + " xmlns:C=\"urn:ietf:params:xml:ns:carddav\">\n" 
       + " <D:prop>\n" + " <D:displayname />\n" 
       + " <C:getctag />\n" + " </D:prop>\n" + "</D:propfind>"; 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     DocumentBuilder builder = null; 
     Document doc = null; 
     builder = factory.newDocumentBuilder(); 
     System.out.println("namespaceAware=" + builder.isNamespaceAware() 
       + ", validating=" + builder.isValidating()); 
     doc = builder.parse(xml); 
    } 
} 

Lauf es die folgende Ausgabe erzeugt:

namespaceAware=true, validating=false 
Exception in thread "main" java.net.MalformedURLException: no protocol: 
<D:propfind xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:carddav 
    <D:prop> 
    <D:displayname /> 
    <C:getctag /> 
    </D:prop> 
</D:propfind> 
at java.net.URL.<init>(URL.java:593) 
at java.net.URL.<init>(URL.java:490) 
at java.net.URL.<init>(URL.java:439) 
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:620) 
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:148) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:805) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) 
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339) 
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:177) 
at com.lemcke.c.dav.card.DOMTest.main(DOMTest.java:31) 

Die XML ist ein Standardbeispiel für eine CardDAV Anfrage. Ist das ein Konfigurationsproblem bei der Verwendung von Namespaces?

Antwort

1

Die Parse-Methode kann einen InputStream als Parameter oder String verwenden. Wenn Sie eine Zeichenfolge angeben, wird versucht, die Position der Zeichenfolge zu öffnen. In Ihrem Fall ist die Zeichenfolge der Inhalt.

Hier ist, wie Sie dieses Problem beheben:

doc = builder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8")))); 

Sie weitere Informationen finden Sie hier: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

+0

Lage zu sein, nicht nur zu lesen, sondern auch wirklich ein Vorteil ist, zu verstehen :-) –

0

Dies ist mein Code-Schnipsel, die für mich funktioniert:

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

String website enthält eine korrekte URL von XML, zum Beispiel: https://www.w3schools.com/xml/note.xml

Wenn Sie String wollen direkt verwenden, sollten Sie versuchen:

InputSource inputStream = new InputSource(new StringReader(xml)); 
return builder.parse(inputStream);