2010-05-17 6 views
2

Un autre jour, une autre erreur étrange avec SAX, Java et amis.Parser SAX ne résout pas le nom de fichier

Je dois parcourir une liste d'objets File et les transmettre à un analyseur SAX. Toutefois, l'analyseur échoue à cause d'un IOException. Cependant, les diverses méthodes d'objet File confirment que le fichier existe bien.

La sortie que je reçois:

11:53:57.838 [MainThread] DEBUG DefaultReactionFinder - C:\project\trunk\application\config\reactions\TestReactions.xml 
11:53:57.841 [MainThread] ERROR DefaultReactionFinder - C:\project\trunk\application\config\reactions\null (The system cannot find the file specified) 

Le problème est évidemment que null dans la deuxième ligne. J'ai essayé presque toutes les variations de passer le fichier en tant que paramètre à l'analyseur, y compris en tant que String (à la fois de getAbsolutePath() et entré à la main), comme URI et, plus étrangement, comme FileInputStream (pour cela, je reçois le même erreur, sauf que le chemin relatif entier est signalé comme nul, donc C:\project\trunk\null).

Tout ce que je peux penser est que le SAXParserFactory est mal configuré. Cependant, je n'ai aucune idée de ce qui ne va pas.

est le code concerné ici:

SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(true); 
try { 
    parser = factory.newSAXParser(); 
} 
catch (ParserConfigurationException e) { 
    throw new InstantiationException("Error configuring an XML parser. Given error message: \"" + e.getMessage() + "\"."); 
} 
catch (SAXException e) { 
    throw new InstantiationException("Error creating a SAX parser. Given error message: \"" + e.getMessage() + "\"."); 
} 
... 
for (File f : fileLister.getFileList()) { 
    logger.debug(f.getAbsolutePath()); 
    try { 
     parser.parse(f, new ReactionHandler(input)); 
     //FileInputStream fs = new FileInputStream(f); 
     //parser.parse(fs, new ReactionHandler(input)); 
     //fs.close(); 
    } 
    catch (IOException e) { 
     logger.error(e.getMessage()); 
     throw new ReactionNotFoundException("An error occurred processing file \"" + f + "\"."); 
    } 
    ... 
} 

J'ai pas de dispositions particulières pour fournir une implémentation de l'analyseur SAX personnalisé: J'utilise la valeur par défaut du système. Toute aide serait grandement appréciée!

Modifier Plus d'informations:

Mon code lors de l'utilisation des flux:

FileInputStream fs = new FileInputStream(f); 
InputSource is = new InputSource(fs); 
//is.setSystemId(f.toURI().toString()); 
parser.parse(is, new ReactionHandler(input)); 

Ce qui donne une sortie

11:07:10.703 [MainThread] DEBUG DefaultReactionFinder - C:\project\trunk\application\config\reactions\TestReactions.xml 
11:07:10.706 [MainThread] ERROR DefaultReactionFinder - C:\project\trunk\application\null (The system cannot find the file specified) 

qui montre que le répertoire relatif du fichier XML n'est pas résolu correctement. Si j'inclue la ligne qui est commentée, le répertoire relatif est à nouveau résolu correctement. Cela me fait penser que quelque part un réglage est incorrect ...

Répondre

0

Ugh, j'aurais dû savoir ... le problème n'est pas avec le code, mais avec la définition DOCTYPE dans le fichier XML! J'ai donné un identifiant public mais pas un système identifiant. Cela signifie que le fichier que l'analyseur n'a pas pu résoudre n'était pas le fichier XML lui-même, mais plutôt le fichier DTD!

Questions connexes