2017-03-07 91 views
0

我有下面的代碼片斷:這段代碼爲什麼會拋出一個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); 
    } 
} 

運行它產生以下輸出:

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) 

的XML爲請求的CardDAV一個標準的例子。這是使用命名空間時的一些配置問題嗎?

回答

1

解析方法可以將InputStream作爲參數或字符串,如果您給它一個字符串,它會嘗試打開字符串的位置,在您的情況下,字符串是內容。

這裏是你如何解決這個問題:

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

您可以在這裏找到更多的信息: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html

+0

如果能夠不僅要讀,而且要明白的是一個真正的優勢:-) –

0

這是我的代碼片段,其工作對我來說:

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

String website包含XML的正確URL,例如:https://www.w3schools.com/xml/note.xml

如果您想直接使用字符串,你應該嘗試:

InputSource inputStream = new InputSource(new StringReader(xml)); 
return builder.parse(inputStream); 
相關問題