2009-07-15 6 views
0

У меня есть файлы в моей файловой системе в Windows XP. Я хочу проанализировать их с помощью Java (JRE 1.6).Разбор XML-файлов с Java и пробелами в пути к файлу

Проблема в том, что я не понимаю, как работают 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 ??? Wtf?)

или еще такого рода неприятности:

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, но мой журнал говорит мне, что он даже не вызван перед сбоем.


EDIT:

Вот код вызова анализатора.

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 Parser? Вам следует рассмотреть возможность использования URI-пути. – notnoop

ответ

1

Попробуйте этот стиль URI:

файла: /// d: /folder/folder%20with%20space/file.xml

2

Вы просто используете DocumentBuilder.parse(filename)?

Если это так, это не так, потому что он ожидает URI. Откройте файл FileInputStream, а затем передайте его DocumentBuilder.parse(InputStream).

+0

Я использую DocumentBuilder.parse (InputStream). – glmxndr

1

Похоже, он пытается подключиться к URL-адресу в заголовке doctype, чтобы он мог загрузить его, чтобы проверить документ с загруженным DTD.

0

Попробуйте это.

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

вместо того, чтобы просто разборе «тест»