2009-07-15 67 views
0

我的文件系統上存在Windows XP上的文件。我想用Java解析它們(JRE 1.6)。使用Java和文件路徑中的空格解析XML文件

問題是,我不明白Java和Xerces如何在文件路徑中有空格時一起工作。

如果該文件的路徑中沒有空格,則一切正常。

如果有空間,我可能有這樣的麻煩,即使我調用分析器與一個FileInputStream實例

java.net.UnknownHostException: . 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.NetworkClient.openServer(Unknown Source) 
    at sun.net.ftp.FtpClient.openServer(Unknown Source) 
    at sun.net.ftp.FtpClient.openServer(Unknown Source) 
    at sun.net.www.protocol.ftp.FtpURLConnection.connect(Unknown Source) 
    at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(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.XMLNSDocumentScannerImpl.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 javax.xml.parsers.DocumentBuilder.parse(Unknown Source) 

sun.net.ftp.FtpClient.openServer ???跆拳道?)

或否則這種麻煩:

java.net.MalformedURLException: unknown protocol: d 
    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.XMLNSDocumentScannerImpl.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) 

(它說unknown protocol: d因爲,我想,該文件是在D驅動器)。

有沒有人知道爲什麼會發生這種情況,以及如何規避問題?我試圖提供我自己的EntityResolver,但是我的日誌告訴我它在崩潰之前甚至沒有調用。


編輯:

這裏是調用分析器的代碼。

public Document fileToDom(File file) throws ProcessException { 
    Document doc = null; 
    try { 
     DocumentBuilderFactory db = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = db.newDocumentBuilder(); 
     if (this.errorHandler!=null){ 
      builder.setErrorHandler(this.errorHandler);} 
     else { 
      builder.setErrorHandler(new DefaultHandler()); 
     } 
     FileInputStream test= new FileInputStream(file); 
     doc = builder.parse(test); 
     ... 
    } catch (Exception e) {...} 
    ... 
} 

就目前而言,我發現自己被迫解析,從而消除所有問題之前除去DOCTYPE,和DTD驗證......沒那麼大的解決方案。

+0

你能告訴你正在使用調用XML解析器的代碼?您應該考慮使用URI路徑。 – notnoop 2009-07-15 15:24:28

回答

1

試試這個URI風格:

文件:/// d:/folder/folder%20with%20space/file.xml

2

你只是使用DocumentBuilder.parse(filename)

如果是這樣,那就失敗了,因爲它期望一個URI。打開文件FileInputStream,然後將其傳遞給DocumentBuilder.parse(InputStream)

+0

我正在使用DocumentBuilder.parse(InputStream)。 – glmxndr 2009-07-15 15:34:00

1

它看起來好像試圖連接到doctype頭中的一個URL,因此它可以下載它以便根據下載的DTD驗證文檔。

0

試試這個。

InputSource is = new InputSource(); 
is.setCharacterStream(new StringReader(test)); 
doc = builder.parse(is); 

,而不是僅僅解析「測試」